如何使用 bash 递归复制同一本地文件夹中的文件?

How to make recursive copy of files in the same local folder with bash?

我最近试图递归地遍历一个目录,并将名为 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 '{}' \;

有没有人有在源目录的一次迭代中执行此操作的方法?

这是一个简单的答案:

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以查看它实际执行的命令。