我有一个包含一系列文件的文件夹:
prefix_1234_567.png
prefix_abcd_efg.png
我想批量删除一个下划线和中间内容,以便输出
prefix_567.png
prefix_efg.png
感谢 相关但不完全解释: how can I batch rename files using the Terminal? Regex to batch rename files in OS X Terminal
答案 0 :(得分:196)
在您的特定情况下,您可以使用以下bash
命令(bash
是macOS上的默认shell):
for f in *.png; do echo mv "$f" "${f/_*_/_}"; done
注意:如果您的文件名可能以-
开头,请将--
放在他们面前[1]:
mv -- "$f" "${f/_*_/_}"
注意:echo
位于mv
之前,以执行干运行。删除它以执行实际重命名。
您可以从命令行运行它,也可以在脚本中使用它。
"${f/_*_/_}"
是bash
parameter expansion的应用:(第一个)子字符串匹配模式_*_
被替换为文字_
,有效地削减了中间令牌从名字。_*_
是模式(通配符表达式,也用于globbing),而不是正则表达式(要了解模式,运行man bash
并搜索Pattern Matching
)。如果您经常批量重命名文件,请考虑安装专用工具,例如基于Perl的rename
utility 。
在macOS上,您可以使用流行的包管理器Homebrew安装它,如下所示:
brew install rename
以下是使用rename
的顶部命令的等效内容:
rename -n -e 's/_.*_/_/' *.png
同样,这个命令执行干运行;删除-n
以执行实际重命名。
bash
解决方案类似,s/.../.../
执行文字替换,但与bash
不同 - 使用了真正的正则表达式。 [1]大多数实用程序支持的特殊参数--
的目的是表明后续参数应被视为操作数(值),甚至如果他们看起来像选项那样期刊,因为-
作为Jacob C.注释。
答案 1 :(得分:86)
要重命名文件,您可以使用rename
实用程序:
brew install rename
例如,要更改当前目录中所有文件名中的搜索字符串:
rename -nvs searchword replaceword *
删除'n'参数以应用更改。
更多信息:man rename
答案 2 :(得分:12)
您可以使用sed:
ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv
结果:
prefix_567.png prefix_efg.png
*首先进行干运行,最后用mv
替换echo
说明:
答案 3 :(得分:7)
我有一批看起来像这样的文件:be90-01.png,需要将短划线更改为下划线。我用过这个,效果很好:
for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
答案 4 :(得分:2)
您可以使用rename
安装brew
命令。只需brew install rename
并使用它。
答案 5 :(得分:1)
试试这个
for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done
这是另一种方式:
for file in Name*.png; do mv "$file" "01_$file"; done
答案 6 :(得分:1)
由于以编程方式重命名文件是有风险的(如果你弄错了可能会造成破坏),我会使用一个专门为批量重命名而构建的带有试运行模式的工具,例如renamer。
此命令对当前目录中的所有文件进行操作,使用 --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.
更多重命名器用法示例here。