为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕村225694 2021-04-04 20:31:09
我要制作一个特定的副本。我解释所以这是我的主文件夹:Sub-Directory-name-01\filename-01.jpgSub-Directory-name-01\filename-02.jpgSub-Directory-name-01\filename-03.jpgSub-Directory-name-01\special-filename-01.jpgSub-Directory-name-02\filename2-01.jpgSub-Directory-name-02\filename2-02.jpgSub-Directory-name-02\filename2-03.jpgSub-Directory-name-02\special-filename2-01.jpgSub-Directory-name-02\filename2-01.jpgSub-Directory-name-02\filename2-02.jpgSub-Directory-name-02\filename2-03.jpgSub-Directory-name-02\special-filename2-01.jpg我想从所有目录中复制所有文件,并且:-保留原始文件-复制原始文件2次-为新名称添加前缀-第一次复制的前缀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 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

请注意,以上由循环$file设置,即在cmdline中,您仅使用了循环中的最后一个剩余值。for file in ... ; do ... ;donexargs

要考虑的一些事情:

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

  • 需要分开,DIR/FILENAME因为所需的命令类似于“ cp $ DIR / $ FILENAME $ DIR / prefix-01- $ FILENAME”(以及前缀02),find ... -printf "%h %f\n"为此

  • 对于每一行,都需要做一些事情(前缀01,02)=>通过以下方式使用脚本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"' --

在每行xargs运行时sh -c '<scriptlet>' -- DIR FILE脚本将分别正确评估$1$2

--jjo

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

[更新:已固定为%f代替%P,如以下评论所述]


查看完整回答
反对 回复 2021-04-16
  • 1 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信