Bulk Rename Multiple Files

I wrote this post as a memo, in case I cannot remember those commands... In Linux/Unix, depending on the situation, we can rename a massive of files in bulk through the rename command. There are two versions of rename. The C version is shipped with util-linux package. It has only limited features, and it doe不支持正则表达式,功能比较简单。除此之外,还有一个 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
基本上总结下来就这些常见场景吧。