问题描述
我需要重命名以下内容:
file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png
成
upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png
如何通过一行简单的终端命令实现这一目标?
最佳解决方案
以上示例的解决方案,使用rename:
rename -v -n 's/file_\d{1,3}/upl/' file_*.png
用法:
rename [options] [Perl regex search/replace expression] [files]
来自man rename
:
-v, --verbose
Verbose: print names of files successfully renamed.
-n, --no-act
No Action: show what files would have been renamed.
重命名可以将正则表达式作为参数。
我们要看的是单引号'
之间的内容。您可以将正则表达式分隔为/
。
式:s/(1)/(2)/
,其中(1)
=搜索模式,(2)
=替换模式。
那么,familiarize youself with regex,并享受基于模式的批处理文件重命名!
次佳解决方案
这可以通过bash参数扩展的一点点魔力来完成!
for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done
file_[0-9]*_*;
– 第一个模式用于通过’file_anynumber_’ ${f#file_[0-9]*_}
开头的所有文件 – 第二个模式file_[0-9]*_
用于参数扩展,它告诉bash从字符串的请求中删除’file_anynumber_’。
有关Parameter expansion
的更多信息:
man bash
第三种解决方案
如果文件位于几个目录中,请在查找之后使用重命名:
find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;
重命名后的-n是测试,删除它继续! – )
像这样,你关联查找和重命名权力。
就个人而言,我用它将源头.h重命名为.hpp
find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;