Grep
將具有特定副檔名的文件從許多嵌套子目錄複製到單個目錄,並將目錄名稱附加到每個複制的文件
我有一個父目錄,子目錄中有數千個目錄,依此類推。在
some
子目錄中,我有幾個圖像文件。我想將子目錄中的所有和文件複製(
rsync
首選)到一個沒有任何子目錄的新目錄。但同時我想將文件來自的 LAST 目錄的名稱附加到複製的文件中。bmp``jpg
├── example1 │ ├── fdfd │ │ ├── db_files │ │ │ ├── asdasd.zip │ │ │ ├── dfdfsta.zip │ │ │ ├── csf_4545.zip │ │ │ ├── 45455.zip │ │ │ ├── 4544.zip │ │ │ ├── 45545.zip │ │ │ ├── gfdfgd.zip │ │ │ ├── retert.zip │ │ │ ├── vcxvxc.zip │ │ │ ├── vcxcvcx.zip │ │ │ ├── asdr3.zip │ │ │ ├── tetst.zip │ │ │ ├── testeh.bmp │ │ │ └── testst43.zip │ │ ├── TEST_FILE.bmp │ │ └── hfexport.csv │ └── testFOLDER2018-05 │ ├── Databasef.txt │ ├── Folder_Backup_2014-01-05.7z │ ├── full_Export.pdf │ ├── f-to-7000.csv │ ├── f-to-505.csv │ ├── f-to-600.csv │ ├── f-to-960.bmp │ ├── g-to-1000.jpg │ └── 7000.csv ├── example3 │ ├── img_copy │ │ ├── automation │ │ │ ├── f.sh │ │ │ ├── fff.sh │ │ │ └── test.bat │ │ ├── all.bmp │ │ ├── h23.txt │ │ ├── old2_copy.jpg
在上面的範例中,複製的文件將如下所示:
db_files_testeh.bmp fdfd_TEST_FILE.bmp testFOLDER2018-05_f-to-960.bmp testFOLDER2018-05_g-to-1000.jpg img_copy_all.bmp img_copy_old2_copy.jpg
我怎樣才能做到這一點?
我使用以下命令僅將文件複製
bmp
到jpg
新目錄。find -regex '.*\.\(bmp\|jpg\)' | tee /home/tmp/matches.txt while read -r LINE; do rsync -vh --append-verify --chmod=ugo=rwX --progress --stats "$LINE" /mnt/storage3/backups/NEW_DIR/ONLY_IMAGES; done < /home/tmp/matches.txt
find . -type f '(' -name '*.bmp' -o -name '*.jpg' ')' -exec sh -c ' for pathname do newname="${pathname%/*}_${pathname##*/}" # a/b/c/d.bmp --> a/b/c_d.bmp newname="target/${newname##*/}" # a/b/c_d.bmp --> target/c_d.bmp printf "Would move %s to %s\n" "$pathname" "$newname" # mv -i "$pathname" "$newname" done' sh {} +
.jpg
這將查找文件名以或結尾的所有正常文件.bmp
。對於這些文件的批次,將執行一個簡短的 shell 腳本。shell 腳本提取每個文件的目錄路徑名及其文件名,並在兩者之間用下劃線連接兩者。這形成了新名稱。然後將新名稱從其初始目錄中刪除,只留下文件名,並將目標目錄路徑附加到該目錄中。
為了安全起見,final
mv
被註釋掉了。執行一次,將其註釋掉,看看它是否正確。有關的: