如何使用 find 和 mv 批量更改多个文件名

Fat*_*agh 4 command-line batch-rename

我的许多目录中有很多拼写错误的文件。

它们是拼写的Localisation.json,我想将它们更改为Localization.json.

我尝试了这个,但它不起作用:

find -type f -name Localis* | xargs mv Localization.json
Run Code Online (Sandbox Code Playgroud)

Raf*_*ffa 13

注意

首先find -type f -name Localis* | xargs mv Localization.json永远不会工作...您需要类似xargs -I {} mv {} Localization.json或设置的xargs选项-n 1

其次mv这里的选择并不正确,因为它会导致当前工作目录的所有子目录中名为eg的所有文件Localisation.json或任何find匹配和输出的Localization.json文件)移动到当前工作目录并重命名为每次都覆盖该文件。 .. 例如find可能会输出类似的内容./subdirectory/Localisation.json,并且会mv像这样翻译:

mv ./subdirectory/Localisation.json Localization.json
Run Code Online (Sandbox Code Playgroud)

将目标目录更改为当前工作目录...您肯定不希望这样。

所以, ...

建议

您可以将find的输出格式化为 NULL 分隔(为了尽量避免破坏包含例如空格的文件名),然后将其通过管道-print0传输到,如下所示:xargs -0rename

find -type f -name "Localisation.json" -print0 | xargs -0 rename -n 's/Localisation\.json$/Localization.json/'
Run Code Online (Sandbox Code Playgroud)

或者。甚至更好,而且相对高效......你可以使用find's own ,如下所示-execrename

find -type f -name "Localisation.json" -exec rename -n 's/Localisation\.json$/Localization.json/' {} \+
Run Code Online (Sandbox Code Playgroud)

引用例如的论点很-name重要-name "Localis*"

请注意,sCurrentName部分中的所有内容都被视为正则表达式...因此,转义点用于匹配文字,而 则匹配行尾,排除重命名的目录,以防您有具有相同文件名的父目录例如(这也可以通过的选项来实现rename's/CurrentName/NewName/'\..$Localisation.json/Localisation.jsonrename--nopath

rename选项-n只会模拟重命名...当对输出感到满意时将其删除以进行实际的重命名。

解决方法

您可以使用find's -execdir从包含匹配文件的子目录运行指定的命令),mv如下所示:

find -type f -name "Localisation.json" -execdir echo mv -n -- {} Localization.json \;
Run Code Online (Sandbox Code Playgroud)

您还可以在命令字符串中使用find's -execwith ,利用's 参数扩展并获得相同的结果,如下所示:mvbashbash

find -type f -name "Localisation.json" -exec bash -c 'echo mv -n -- "$1" "${1/%Localisation.json/Localization.json}"' _ {} \;
Run Code Online (Sandbox Code Playgroud)

这只会进行重命名试运行(模拟) ...echo对输出满意时删除以进行实际重命名。

或者,在 中bash,您可以使用递归 shell 通配符和参数扩展来mv实现相同的结果,如下所示:

shopt -s globstar; for f in **/Localisation.json; do
    # Renaming dry-run(simulation) ... Remove "echo" when satisfied with output to do the actual renaming.
    echo mv -n -- "$f" "${f/%Localisation.json/Localization.json}"
done; shopt -u globstar
Run Code Online (Sandbox Code Playgroud)

  • 要解决“mv”将所有内容移动到当前工作目录的问题,请使用“-execdir” (2认同)
  • +1提供安全的解决方案:“*重命名的选项-n只会模拟重命名...当对输出感到满意时将其删除以进行实际的重命名。*”真正专业人士的标志。 (2认同)