【问题标题】:How to make recursive copy of files in the same local folder with bash?如何使用bash在同一本地文件夹中制作文件的递归副本?
【发布时间】:2017-10-14 17:06:10
【问题描述】:

我最近试图递归遍历一个目录并将所有名为file.jpg的文件复制到与原始目录相同的本地目录中的newfile.jpg

我找到了一种方法,但它有点麻烦,我有理由相信这可能不是最好的方法。我想在将其放入脚本之前我会问一下。

这是我目前所拥有的:

cd top_of_source_dir
#copy all file.jpg and append 'newfile.jpg' to the name
find ./ -type f -name file.jpg -exec cp '{}' '{}newfile.jpg' \;

#rename the newly created files to 'newfile.jpg'
find ./ -type f -name 'file.jpgnewfile.jpg' -exec rename file.jpgn n '{}' \;

有没有人有办法在源目录的一次迭代中做到这一点?

【问题讨论】:

  • 如果您确定输出正确,您可能希望 for f in *.jpg; do echo "$f" "new${f%.*}.jpg"; doneecho 更改为 mv
  • @val0x00ff 这不会通过源目录进行递归,是吗?我的文件可以多级进入源目录。
  • # Jacques Gaudin,不,它没有,但你可以做类似find ./ -type f -name '*.jpg' -exec bash -c 'for f; do n="new${f##*/}"; echo "$f" -> "${f%/*}/$n"; done' _ {} + 之类的事情,如果你认为结果是正确的,再次用 'mv` 替换 echo
  • 另外不要忘记删除我放在那里的->。只是将动作可视化

标签: bash copy subdirectory


【解决方案1】:

这是一个简单的答案:

find -type f -name file.jpg -print -printf '%h/newfile.jpg\n' | xargs -n2 -d'\n' mv

这使得find 为每个匹配条目生成两行:旧文件路径和新文件路径(%h 替换为目录路径)。

xargs 然后每连续两行执行mv

  • -d'\n' 指定输入流的元素是换行符分隔的,这里就是这种情况;
  • -n2 指定xargs 应该一次读取两个元素并将其传递给命令:如果两个元素是foobar,那么xargs 将运行mv foo bar,然后读取下一对,然后重复。

mv 替换为echo mv 以查看它实际执行的命令。

【讨论】:

  • 谢谢,我脑海里有xargs,但我不熟悉。
  • @JacquesGaudin 好吧,你应该是因为它非常强大:)
  • @JacquesGaudin 我添加了我使用的选项的描述。
猜你喜欢
  • 2019-08-05
  • 2011-08-23
  • 1970-01-01
  • 2018-03-12
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多