真的很酷 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
perl
and xargs
: -0
stdin 分隔符是空字节(而不是空格)
- In
perl
: -l0
stdout 分隔符是空字节(八进制 000)