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

时间:2018-05-10 09:38:14

标签: linux unix command-line copy xargs

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

所以这里是我的主文件夹:

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倍
- 为新名称添加前缀
- first-01表示第一份副本
- 第二个副本的前缀-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中添加第二个副本。

由于

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

1 个答案:

答案 0 :(得分:0)

请注意,上面的ng serve仅在$file循环中设置为 ,即在for file in ... ; do ... ;done cmdline中,您刚刚使用了最后一个剩余< / em>来自循环的值。

需要考虑的一些事项:

  • 需要单独处理每个文件=&gt;使用xargs(处理每1行)。

  • 需要将xargs -l1分开,因为所需的命令类似于'cp $ DIR / $ FILENAME $ DIR / prefix-01- $ FILENAME'(以及前缀-02),使用{{1这个

  • 对于每一行,需要做几件事(prefix-01,02)=&gt;通过DIR/FILENAME

  • 使用 scriptlet
  • 最好从find ... -printf "%h %f\n"跳过sh -c '<scriptlet>'个文件,以便能够在不“累积”副本的情况下重新运行

可能的实施方式是:

prefix-0?-*.jpg

find为每一行运行find . -type f \( -iname "*.jpg" ! -iname "special-*.jpg" ! -name "prefix-0?-*.jpg" \) -printf "%h %f\n" | \ xargs -l1 sh -c 'cp -v "$1/$2" "$1/prefix-01-$2"; cp -v "$1/$2" "$1/prefix-02-$2"' -- 时, scriptlet 将分别正确评估xargssh -c '<scriptlet>' -- DIR FILE

- jjo

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

[更新:已修复为使用$2而不是/,根据以下评论]