将具有特定扩展名的文件从许多嵌套子目录复制到单个目录,并将目录名称附加到每个复制的文件中

将具有特定扩展名的文件从许多嵌套子目录复制到单个目录,并将目录名称附加到每个复制的文件中

我有一个父目录,子目录中有数千个目录等等。在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

我怎样才能实现这个目标?

我使用以下命令仅将文件复制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

答案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被注释掉了。运行一次并注释掉它,看看它是否做正确的事情。

有关的:

相关内容