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


48

我需要重命名以下内容:

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
基于故障安全正则表达式的python版本,可在所有子文件夹上递归工作:stackoverflow.com/a/39698169/191246
ccpizza

Answers:


79

上面示例的解决方案,使用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)=替换模式。

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


14
我知道这是Ubuntu,但即使有人在寻找OS X解决方案(我确实这样做),即使最终有人到这里,rename也可以轻松地安装brew install rename
sandstrom

在Ubuntu 18.10中,该--no-act标志--nono改为。这个答案也可能更明确:[files]指的是一种初始模式,该模式匹配当前目录中要重命名的文件(例如,*匹配所有内容,但仅匹配当前目录中的文件)。
Patrick Dark

您的链接指向另一个rename,其格式rename from to file不支持正则表达式。实际上,我的Linux发行版(Cent OS 7)具有该版本。
Alex Che

6

如果文件在几个目录中,请在类似以下命令后使用重命名:

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/' {} \;

有文件的-iname-type以及-exec在标志manpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression。(find --help对于此命令不是特别有用。)TL; DR:-iname不区分大小写地匹配模式;-type f匹配“常规文件”;并-exec执行一个表达式,直到遇到;(分号)字符为止。
Patrick黑暗

5

这可以通过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

请注意,这使用的是glob,而不是正则表达式,因此[0-9]*将匹配一位数字后跟任何字符串。可能只有更好的方法来匹配数字,但我想不到任何简洁的方法。
wjandrea

您还能提出一种方法来使此命令在所有子目录中递归工作吗?
Francesco DM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.