Shell工具-Mac批量修改文件名

Mac 有自带的工具 Automator 可以批量修改文件名,但对程序员这种需要经常周游在各种 *nix 系统的生物来说,会用 shell 显然是更好的。

SED

这里面起主要作用的 shell 工具是 SED(Stream Editor),这是一款擅长正则表达式处理的工具。

假设我们有如下命名类似的文件:

屏幕快照 2016-07-05 下午7.40.05
屏幕快照 2016-07-05 下午7.40.05

现在需要把这些文件名改为 eye_21.png ~ eye_37.png,

下面直接上一段 shell 代码,看看 sed 怎么用:

1
2
3
4
for file in `ls *.png`
do
mv "$file" `echo "$file" | sed 's/\(.*\_.*\_\)\(.*\)/\eye_\2/g'`
done

( Shell 里面用到命令时一定要用``包起来)

奇怪的是 mac 没有提供 rename 命令,所以只能用 mv 来修改文件名。现在具体看 sed 指令的用法。

1
sed 's/\(.*\_.*\_\)\(.*\)/eye_\2/g'

sed 后面跟着一段正则表达式,用 s/{reg}/g 包围,双斜杆里面的 {reg} 就是正则表达式了,就本例子而言,需要把文件名前面的 pic_s4_ 更换为 eye_。具体的做法是将字符串分成两部分(即两个括号的内容)。第一个括号的内容表示 pic_s4_,第二个括号则表示任意字符。但是怎么替换字符串呢?注意到正则表达式后面的内容(使用正则表达式时要注意用 ‘\’ 转义),“eye_\2” 表示替换规则。“eye_” 表示替换后的文件名字符串中以 eye_ 开始,\2 表示引用第二个括号的内容(注意需要使用 \ 转义)。替换后的文件名如下:

屏幕快照 2016-07-05 下午8.23.57
屏幕快照 2016-07-05 下午8.23.57

sed 还有一个 ‘-r’ 的参数可以让正则表达式更加简洁,但我在 mac 发现这个参数没法使用。

sed 更多具体方法,之后有用到时再补充。