Bash 如何在macOS终端中批量重命名文件?
我有一个文件夹,其中包含一系列文件,名为:Bash 如何在macOS终端中批量重命名文件?,bash,macos,shell,terminal,file-rename,Bash,Macos,Shell,Terminal,File Rename,我有一个文件夹,其中包含一系列文件,名为: prefix_1234_567.png prefix_abcd_efg.png 我想批量删除一个下划线和中间内容,以便输出为: prefix_567.png prefix_efg.png 相关但不完全解释: 在您的特定情况下,您可以使用以下bash命令(bash是macOS上的默认shell): 注意:如果文件名可能以-开头,请将-放在它们前面[1]: mv--“$f”“${f/*./}” 注意:echo在mv前面加上前缀,以便执行试运行。将
prefix_1234_567.png
prefix_abcd_efg.png
我想批量删除一个下划线和中间内容,以便输出为:
prefix_567.png
prefix_efg.png
相关但不完全解释:
bash
命令(bash
是macOS上的默认shell):
注意:如果文件名可能以-
开头,请将-
放在它们前面[1]:mv--“$f”“${f/*./}”
注意:echo
在mv
前面加上前缀,以便执行试运行。将其删除以执行实际重命名。
您可以从命令行运行它,也可以在脚本中使用它
是“${f/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\”
的一个应用程序:将(第一个)子字符串匹配模式bash
替换为literal\\\\\\\\\\
,有效地从名称中删除中间标记\\
- 请注意,
是一个模式(通配符表达式,也用于全局搜索),而不是正则表达式(要了解模式,请运行.*.
并搜索manbash
)模式匹配
如果您发现自己经常批量重命名文件,请考虑安装一个专用工具,例如基于Perl的。 在macOS上,您可以使用流行的软件包管理器安装它,如下所示:
brew install rename
下面是使用rename
在顶部执行的等效命令:
rename -n -e 's/_.*_/_/' *.png
同样,该命令执行一次试运行;删除-n
以执行实际重命名
- 与
解决方案类似,bash
执行文本替换,但与s/../../
中不同的是,使用了真正的正则表达式bash
[1] 大多数实用程序都支持特殊参数
--
,它的目的是表明后续参数应被视为操作数(值),即使它们看起来像选项,因为它们以-
开头,如注释所示。您可以使用sed:
ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv
结果:
prefix_567.png prefix_efg.png
*要先进行试运行,请将最后的mv
替换为echo
说明:
- e:仅1个sed命令可选李>
- p:要将输入打印到sed,在这种情况下,它将是任何重命名之前的原始文件名
- @:是/字符的替换,以使sed更具可读性。也就是说,不要使用sed s/search/replace/g,而是使用s@search@replace@g
- _.*:下划线是一个转义字符,用于引用实际的“.”字符零次或多次(与正则表达式中的任何字符相反)
- -n2:表示有2个输出需要作为参数传递给mv。对于ls的每个输入,该sed命令将生成2个输出,然后提供给mv
for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
要重命名文件,可以使用
重命名
实用程序:
brew安装重命名
例如,要更改当前目录中所有文件名中的搜索字符串,请执行以下操作:
rename -nvs searchword replaceword *
删除“n”参数以应用更改
更多信息:
manrename
您可以使用brew
安装rename
命令。只需执行brew安装重命名
并使用它。使用mmv
mmv '*_*_*' '#1_#3' *.png
试试这个
for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done
还有一种方法:
for file in Name*.png; do mv "$file" "01_$file"; done
由于以编程方式重命名文件是有风险的(如果你弄错了,可能会造成破坏),我会使用一个专门为批量重命名构建的带干运行模式的工具,例如 此命令对当前目录中的所有文件进行操作,请使用
--dry run
,直到确信输出正确为止:
$ renamer --find "/(prefix_)(\w+_)(\w+)/" --replace "$1$3" -e name --dry-run *
Dry run
✔︎ prefix_1234_567.png → prefix_567.png
✔︎ prefix_abcd_efg.png → prefix_efg.png
Rename complete: 2 of 2 files renamed.
还有很多重命名器使用示例。看看NSString和NSMutableString的范围和子字符串方法,您是否考虑过这方面的非终端解决方案?自动机工作流可以轻松地执行这些类型的操作。您可以创建一个automator工作流来重命名所有文件,并将文本替换为空白的
.*.
。使其更为通用,以便也支持带有嵌入空格的文件名,会变得更加神秘:ls*| xargs-I%bash-c'echo mv%”$(sed's@_.*_@_@“回答得很好,效果很好。我也很感激你回去编辑了它,以便对其进行更多的解释,如果我重复这一点,还可以提供更优雅的解决方案。再次非常感谢,这是一个使用匹配替换的示例(*
->$1
)例如,重命名foobar S01E01 biz baz.ext
为S01E01.ext
:Rename-n-e's/*(s[0-9]{2}e[0-9]{2}.*(\.[a-z]{2,4})/$1$2/'*
喜欢使用echo
进行干运行的想法。感谢您的提示!强烈建议您只需执行brew-Rename
OS-code>(x86_64-apple-darwin)不包括重命名实用程序。谢谢,是的,它需要通过brew安装重命名来安装。这个技巧太棒了!我输入了rename-vs-GLYCOPHORIN glyc*
,现在它自动重命名450多个文件。而且速度也非常快。太棒了!喜欢“显示将要更改的内容”这句话“在它实际重命名东西之前使用part!您也可以使用正则表达式。重命名's/123/onetwother/g'*鉴于这是OS X,正确的安装过程是brew安装mmv
。
$ renamer --find "/(prefix_)(\w+_)(\w+)/" --replace "$1$3" -e name --dry-run *
Dry run
✔︎ prefix_1234_567.png → prefix_567.png
✔︎ prefix_abcd_efg.png → prefix_efg.png
Rename complete: 2 of 2 files renamed.