对多个文件批量重命名

本文只作为备忘,年纪大了,命令老记不住……

在 Linux/Unix 下,根据不同的使用场景,可以通过 rename 命令的不同参数组合来实现对大量文件进行批量重命名的操作。

rename 有两个版本,util-linux 包提供的是 C 版本的 rename 命令,不支持正则表达式,功能比较简单。除此之外,还有一个 perl 版本的 rename,功能更强大一点。

以下示例不区分 C 版本和 perl 版本的 rename 命令,自己尝试吧。

示例 1:有一批以 photo 开头的 jpg 文件,我需要把其中的 photo 字符串替换为 pic。

$ rename photo pic photo*.jpg

示例 2:我需要把所有的 .jpg 扩展名改为 .jpeg。

$ rename .jpg .jpeg *.jpg

或者

$ rename 's/\.jpg$/\.jpeg/' *.jpg

示例 3:有一批文件,以 .bak结尾,现在想把这些 .bak 统统去掉。

$ rename 's/\.bak$//' *.bak

示例 4:把所有文件的文件名改为小写。

$ rename 'y/A-Z/a-z/' *

举一反三,如果要改成大写的话:

$ rename 'y/a-z/A-Z/' *

示例 5:批量去掉文件名里面的空格。

$ rename 's/[ ]+/_/g' *

方括号内的空格可以用 [:space:] 代替,即

$ rename 's/[[:space:]]+/_/g' *

示例 6:统一在文件名最前面加上 photo。

$ rename 's/^/photo/' *

示例 7:统一在尾部追加 .zip 后缀。

$ rename 's/$/.zip/' *

示例 8:按顺序重命名所有文件,例如把 1.jpg,2.jpg,3.jpg…100.jpg 重命名为 001.jpg,002.jpg,003.jpg…100.jpg。

$ rename 's/^/00/' [0-9].jpg
# 这一步把 1.jpg...9.jpg 变为 001.jpg...009.jpg
$ rename 's/^/0/' [0-9][0-9].jpg
# 这一步把 10.jpg...99.jpg 变为 010.jpg...090.jpg

以下示例我们不借助 rename 命令,而是通过脚本来实现更复杂的重命名需求。

示例 9:将 abcd.jpg 重命名为 abcd_efg.jpg。

$ for var in *.jpg; do mv "$var" "${var%.jpg}_efg.jpg"; done

示例 10:将 abcd_efg.jpg 重命名为 abcd_lmn.jpg。

$ for var in *.jpg; do mv "$var" "${var%_efg.jpg}_lmn.jpg"; done

示例 11:把格式 *_?.jpg 的文件改为 *_0?.jpg。

$ for var in `ls *_?.jpg`; do mv "$var" `echo "$var" |awk -F '_' '{print $1 "_0" $2}'`; done

示例 12:把文件名的前三个字母变为 abcde。

$ for var in `ls`; do mv -f "$var" `echo "$var" |sed 's/^.../abcde/'`; done

示例 13:把文件名的后四个字母变为 uvwxyz。

$ for var in `ls`; do mv -f "$var" `echo "$var" |sed 's/....$/uvwxyz/'`; done

示例 14:把 .txt 变成 .txt_bak 的后缀。

$ ls *.txt|xargs -n1 -i{} mv {} {}_bak

基本上总结下来就这些常见场景吧。