使用 cut 以及 find 和 exec 时转义特殊字符

Escape special characters while using cut along with find and exec

我必须对单个文件夹中的多个文件执行以下操作:

Remove "01 " like part from file names like "01 x y z.mp3".

为此,我构建了以下命令:

find . -name '*.mp3' -exec sh -c "mv "{}" `echo "{}" | cut -d' ' -f2-`" \;

但是在执行上述命令时出现以下错误:

sh: 1: Syntax error: "(" unexpected
sh: 1: Up.mp3: not found

第一个错误是由于文件名中存在“(”字符,第二个错误是由于文件名为“03 Up&Up.mp3”。所以在这两种情况下,错误都是因为 sh 无法转义特殊字符。

请提出适当的更改以正确执行上述操作。

应该是:

find -name '*.mp3' -exec bash -c 'mv  "{}" "$(cut -d" " -f2- <<< "{}")"' \;

使用rename工具

rename 's/^[0-9]+ //' *.mp3

请注意,这不是所有 linux 发行版中的标准工具,而是指最初由 Larry Wall 编写的 perl 脚本。请参阅 man rename 以检查您的系统中可用的内容。

它通过转义 {} 上使用的 "" 来工作:

找到。 -name '*.mp3' -exec sh -c "mv \"{}\" echo \"{}\" | cut -d' ' -f2-" \;

@lurker 建议