真的很酷 lil diddy。查找 + perl + xargs + mv
xargs -n2可以每行打印两个参数。当与 Perl 结合使用时print $_(首先打印 $STDIN),它是一个强大的重命名工具。
find . -type f | perl -pe 'print $_; s/input/output/' | xargs -d "\n" -n2 mv
perl -pe 'print $_; s/OldName/NewName/' | xargs -n2最终的结果是:
OldName.ext NewName.ext
OldName.ext NewName.ext
OldName.ext NewName.ext
OldName.ext NewName.ext
我的系统上没有rename现成的 Perl。
它是如何工作的?
find . -type f输出文件路径(或文件名......您可以在这里控制正则表达式处理的内容!)
-p打印正则表达式处理的文件路径,-e执行内联脚本
print $_首先打印原始文件名(独立于-p)
-d "\n"通过换行符而不是默认空格字符剪切输入
-n2每行打印两个元素
mv获取上一行的输入
我的首选方法,尽管更先进。
假设我想将所有“.txt”文件重命名为“.md”文件:
find . -type f -printf '%P\0' | perl -0 -l0 -pe 'print $_; s/(.*)\.txt/$1\.md/' | xargs -0 -n 2 mv
这里的神奇之处在于管道中的每个进程都支持用作分隔符的空字节 (0x00),而不是空格或换行符。上述方法使用换行符作为分隔符。并不是说我试图在find .不使用子流程的情况下轻松支持。在这里要小心(find在运行正则表达式匹配或更糟糕的破坏性命令之前,您可能需要检查输出mv)。
它是如何工作的(删节以仅包括上面的更改)
- In
find:-printf '%P\0'仅打印没有路径的文件名,后跟空字节。根据您的用例进行调整 - 无论是匹配文件名还是整个路径。
- in
perland xargs: -0stdin 分隔符是空字节(而不是空格)
- In
perl: -l0stdout 分隔符是空字节(八进制 000)