终端中基于模式的批处理文件重命名

Una*_*rai 59 regex rename batch-rename

我需要重命名以下内容:

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png
Run Code Online (Sandbox Code Playgroud)

进入

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png
Run Code Online (Sandbox Code Playgroud)

如何仅使用一行简单的终端命令来实现它?

Una*_*rai 95

上面例子的解决方案,使用rename

rename -v -n 's/file_\d{1,3}/upl/' file_*.png
Run Code Online (Sandbox Code Playgroud)

用法:

rename [options] [Perl regex search/replace expression] [files]
Run Code Online (Sandbox Code Playgroud)

来自man rename

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.
Run Code Online (Sandbox Code Playgroud)

重命名可以将正则表达式作为参数。

我们看到的是单引号之间的内容'。您可以放置​​由/.

公式:s/(1)/(2)/where (1)= 搜索模式,和(2)= 替换模式。

因此,熟悉 regex并享受基于模式的批处理文件重命名!

  • 我知道这是 Ubuntu,但是如果有人在寻找 OS X 解决方案(我确实这样做了)但最终还是来到了这里,那么使用 `brew install rename` 可以轻松安装 `rename`。 (16认同)

bca*_*ag2 7

如果文件位于多个目录中,请在查找后使用重命名,例如:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;
Run Code Online (Sandbox Code Playgroud)

重命名后的 -n 是为了测试,将其删除以继续!-)

像这样,您关联查找和重命名电源。

就个人而言,我用它来将源头文件 .h 重命名为 .hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;
Run Code Online (Sandbox Code Playgroud)


Bas*_*lvi 6

这可以通过 bash 参数扩展的小魔法来完成!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done
Run Code Online (Sandbox Code Playgroud)

file_[0-9]*_*;- 第一个模式用于遍历所有以 'file_anynumber_' 开头的文件
${f#file_[0-9]*_}- 第二个模式file_[0-9]*_用于参数扩展,它告诉 bash 从字符串的请求中删除 'file_anynumber_'。

欲了解更多信息Parameter expansion

man bash
Run Code Online (Sandbox Code Playgroud)