我正在尝试批量重命名以驼峰命名的文件,以在相邻的大写和小写字母之间包含空格。我使用的是 Mac OS,所以我使用的工具是 BSD 变体。
例如:
250 - ErosPhiliaAgape.mp3 => 250 - Eros Philia Agape.mp3
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下命令find
将相关文件传输到在子 shellmv
中运行的文件sed
:
find . -name "*[a-z][A-Z]*" -print0 | xargs -0 -I {} mv {} "$(sed -E 's/([a-z])([A-Z])/\1 \2/g')"
Run Code Online (Sandbox Code Playgroud)
个别地,这些命令工作正常:find
提取正确的文件并正确sed
重命名它,但是当我将它们与 xargs 结合时,没有任何反应。
我需要改变什么才能使这项工作?
问题是$(...)
命令中的子 shell 在您运行命令时进行评估,而不是对xargs
每个文件进行评估。您可以使用find
's-exec
来评估 a 中每个文件的命令sh
,并适当地替换引用:
find . -name "*[a-z][A-Z]*" -type f -exec sh -c 'echo mv -v "{}" "$(echo "{}" | sed -E "s/([a-z])([A-Z])/\1 \2/g")"' \;
Run Code Online (Sandbox Code Playgroud)
如果这个不错的输出,掉落echo
在echo mv
。请注意,由于echo | sed
,这不适用于嵌入\n
. (但这是您自己尝试中已经存在的限制,所以我希望这是可以接受的。)
归档时间: |
|
查看次数: |
1480 次 |
最近记录: |