我有一个父目录,子目录中有数千个目录等等。在some
子目录中我有几个图像文件。
我想将子目录中的rsync
所有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
答案1
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 脚本提取每个文件的目录路径名及其文件名,并将两者之间用下划线连接起来。这形成了新名称。然后,新名称将删除其初始目录,仅保留文件名,并将目标目录路径附加到此名称。
为了安全起见,决赛mv
被注释掉了。运行一次并注释掉它,看看它是否做正确的事情。
有关的: