我需要重命名以下内容:
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
我如何仅通过一行简单的终端命令来实现它?
答案1
上述示例的解决方案是使用改名:
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)
= 替换模式。
所以,熟悉正则表达式,并享受基于模式的批处理文件重命名!
答案2
这可以通过 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
答案3
如果文件位于多个目录中,请在查找后使用重命名,例如:
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/' {} \;