Grep

將具有特定副檔名的文件從許多嵌套子目錄複製到單個目錄,並將目錄名稱附加到每個複制的文件

  • August 1, 2018

我有一個父目錄,子目錄中有數千個目錄,依此類推。在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

我怎樣才能做到這一點?

我使用以下命令僅將文件複製bmpjpg新目錄。

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 腳本提取每個文件的目錄路徑名及其文件名,並在兩者之間用下劃線連接兩者。這形成了新名稱。然後將新名稱從其初始目錄中刪除,只留下文件名,並將目標目錄路徑附加到該目錄中。

為了安全起見,finalmv被註釋掉了。執行一次,將其註釋掉,看看它是否正確。

有關的:

引用自:https://unix.stackexchange.com/questions/459840