批量重命名驼峰文件以包含空格

6 find xargs rename

我正在尝试批量重命名以驼峰命名的文件,以在相邻的大写和小写字母之间包含空格。我使用的是 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 结合时,没有任何反应。

我需要改变什么才能使这项工作?

jan*_*nos 5

问题是$(...)命令中的子 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)

如果这个不错的输出,掉落echoecho mv。请注意,由于echo | sed,这不适用于嵌入\n. (但这是您自己尝试中已经存在的限制,所以我希望这是可以接受的。)