如何使用 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
应该一次读取两个元素并传递给命令:如果两个元素是foo
和bar
,那么xargs
会运行mv foo bar
,然后读下一对,重复
将mv
替换为echo mv
以查看它实际执行的命令。
我最近试图递归地遍历一个目录,并将名为 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
应该一次读取两个元素并传递给命令:如果两个元素是foo
和bar
,那么xargs
会运行mv foo bar
,然后读下一对,重复
将mv
替换为echo mv
以查看它实际执行的命令。