kid*_*nim 111 macos bash shell terminal file-rename
我有一个文件夹,其中包含一系列名为的文件:
prefix_1234_567.png
prefix_abcd_efg.png
Run Code Online (Sandbox Code Playgroud)
我想批量删除一个下划线和中间内容,以便输出
prefix_567.png
prefix_efg.png
Run Code Online (Sandbox Code Playgroud)
感谢相关但不完全解释: 如何使用终端批量重命名文件? 正则表达式批量重命名OS X终端中的文件
mkl*_*nt0 214
在您的特定情况下,您可以使用以下bash命令(bash是macOS上的默认shell):
for f in *.png; do echo mv "$f" "${f/_*_/_}"; done
Run Code Online (Sandbox Code Playgroud)
注意:如果你的文件名有可能开头-,请放在-- 它们之前[1]:
mv -- "$f" "${f/_*_/_}"
注意:echo前置mv是为了执行干运行.删除它以执行实际重命名.
您可以从命令行运行它或在脚本中使用它.
"${f/_*_/_}"是bash 参数扩展的应用:(第一个)子串匹配模式_*_被文字替换_,有效地从名称中删除中间标记._*_是一种模式(通配符表达式,也用于globbing),而不是正则表达式(了解模式,运行man bash和搜索Pattern Matching).如果您发现自己经常批量重命名文件,请考虑安装专用工具,例如基于Perl的rename实用程序.在macOS上,您可以使用流行的包管理器Homebrew安装它,如下所示:
brew install rename
Run Code Online (Sandbox Code Playgroud)
这是相当于顶部的命令使用rename:
rename -n -e 's/_.*_/_/' *.png
Run Code Online (Sandbox Code Playgroud)
同样,这个命令执行干运行; 删除-n以执行实际重命名.
bash解决方案类似,s/.../.../执行文本替换,但是 - 与 - 不同bash- 使用真正的正则表达式.[1] --大多数实用程序支持的特殊参数的目的是发出后续参数应该被视为操作数(值)的信号,即使它们看起来像是由于开始时的选项-,正如Jacob C.指出的那样.
Dav*_*mas 92
要重命名文件,您可以使用该rename实用程序:
brew install rename
例如,要更改当前目录中所有文件名中的搜索字符串:
rename -nvs searchword replaceword *
Run Code Online (Sandbox Code Playgroud)
删除'n'参数以应用更改.
更多信息: man rename
l'L*_*L'l 12
你可以使用sed:
ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv
Run Code Online (Sandbox Code Playgroud)
结果:
prefix_567.png prefix_efg.png
Run Code Online (Sandbox Code Playgroud)
*首先做一个模拟运行,取代mv在年底与echo
说明:
我有一批看起来像这样的文件:be90-01.png,需要将短划线更改为下划线.我用过这个,效果很好:
for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107239 次 |
| 最近记录: |