使用新文件名从多个目录复制多个文件

Copy multiple file from multiple directories with new filename

我想制作一份特定的副本。 我解释

这里是我的主文件夹:

Sub-Directory-name-01\filename-01.jpg
Sub-Directory-name-01\filename-02.jpg
Sub-Directory-name-01\filename-03.jpg
Sub-Directory-name-01\special-filename-01.jpg

Sub-Directory-name-02\filename2-01.jpg
Sub-Directory-name-02\filename2-02.jpg
Sub-Directory-name-02\filename2-03.jpg
Sub-Directory-name-02\special-filename2-01.jpg


Sub-Directory-name-02\filename2-01.jpg
Sub-Directory-name-02\filename2-02.jpg
Sub-Directory-name-02\filename2-03.jpg
Sub-Directory-name-02\special-filename2-01.jpg

我想从所有目录复制所有文件并且:
- 保留原始文件
- 复制原始文件的2倍
- 为新名称添加前缀
- 第一个副本的 prefix-01
- 第二个副本的 prefix-02
- 将新文件保存在与原始文件相同的目录中

我已经成功使用命令复制 1 次带有 1 个前缀。 它在子目录中工作

for file in *.jpg; do cp "$file" "prefix-$file"; done

我尝试对所有子目录执行此操作,但出现错误

find . -type f \( -iname "*.jpg" ! -iname "special-*.jpg" \) | xargs cp -v "$file" "prefix-$file"

(是的,我排除了一个特殊的名字)

但是我得到了错误:

cp: target `./Sub-Directory-name-01/filename-01.jpg' is not a directory

我不知道如何解决我的问题以及如何在 cmd 中添加第二个副本。

谢谢

编辑:我还没有找到任何类似的问题,所以任何答案都可以解决这个问题。

请注意,$file 上面 $filefor file in ... ; do ... ;done 循环设置 ,即在您的 xargs cmdline 中,您只是使用了最后一个剩余 循环中的值。

需要考虑的一些事项:

  • 需要分别处理每个文件=>使用xargs -l1(每处理1行)。

  • 需要分开 DIR/FILENAME 因为需要的命令类似于 'cp $DIR/$FILENAME $DIR/prefix-01-$FILENAME'(还有 prefix-02),为此使用 find ... -printf "%h %f\n"

  • 对于每一行,需要做一些事情(prefix-01,02)=>通过sh -c '<scriptlet>'[=27使用scriptlet =]

  • 最好跳过 find 中的 prefix-0?-*.jpg 个文件,以便能够重新 运行 它而无需 "accumulating" 个副本

一个可能的实现是:

find . -type f \( -iname "*.jpg" ! -iname "special-*.jpg"  ! -name "prefix-0?-*.jpg" \) -printf "%h %f\n" | \
xargs -l1 sh -c 'cp -v "/" "/prefix-01-"; cp -v "/" "/prefix-02-"' --

As xargs 运行s sh -c '<scriptlet>' -- DIR FILE 每行,scriptlet 将正确评估 </code> 和 <code>分别。

--jjo

PS: 类Unix系统中的目录分隔符是/ :)

[更新:固定使用 %f 而不是 %P,根据下面的评论]