之前有位网友问过,批量修改文件名的方法。然后我当时也是不知道,后来搜索了些许资料我明白了,批量修改文件名可以有很多种方法!在这里向大家推荐我的老师的一篇博文,批量修改文件名。

linux下批量修改文件名精彩解答案例分享 - 老男孩linux运维 - 51CTO技术博客

http://oldboy.blog.51cto.com/2561410/711342

有些网友反馈,那篇博文里老师似乎答的不是很对题。在这里我想说的是,老师只不过是引路人,把你点到为止。不要就只想着老师把标准的答案给你说出来。说出来了,你干嘛呢?是不是,给你说了方法,剩下的自己搞定!

好了废话不多说,只是给网友解决类似的问题。希望能帮到更多的人。

问题是这样的。在一个目录下有很多的文件,而且都很相似。

老套路,先批量创建那些规格差不多的文件名。【测试的第一步】

[root@Jason64-17 net]# for i in `seq -w 10`
> do touch stu\_$i\_linux.jpg
> done
[root@Jason64-17 net]# sl
total 0
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_01_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_02_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_03_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_04_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_05_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_06_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_07_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_08_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_09_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_10_linux.jpg

然后使用rename进行修改

[root@Jason64-17 net]# rename \_linux '' *.jpg
[root@Jason64-17 net]# sl
total 0
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_01.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_02.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_03.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_04.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_05.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_06.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_07.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_08.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_09.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:22 stu_10.jpg

注意,如果想要替换掉下划线,那么你不能加任何引号。

下面是我又创建了许多测试文件来测试的。

[root@Jason64-17 net]# for i in `seq -w 10`; do touch stu\_$i\_linux.jpg; done
[root@Jason64-17 net]# sl
total 0
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_01_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_02_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_03_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_04_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_05_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_06_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_07_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_08_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_09_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:58 stu_10_linux.jpg
[root@Jason64-17 net]# rename '\_linux' '' *.jpg
[root@Jason64-17 net]# sl
total 0
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_01_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_02_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_03_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_04_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_05_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_06_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_07_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_08_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_09_linux.jpg
-rw-r--r-- 1 root root 0 Oct  9 21:27 stu_10_linux.jpg


为什么呢?搜索了相关的资料后,我发现了,rename版本如果是perl版本的,那rename命令是支持正则的;因此在perl版本的rename下,执行上述命令就可以成功,如果你的rename版本是c版本的,那么上述命令是不成功的。这个是版本支持的问题,所以不必深究。

如果想了解的朋友可以戳

http://baike.baidu.com/link?url=ZMVvH0efX-5Z5GR-JAYHOGTWailxrPlo0fNg-Tdt3Xo23y8Apf6MALlWAHa-P55V

既然如此的话,那么在老师博客里面提到的那位网友,可能就是因为他的rename版本不支持导致的。so,这里重点说的就是rename,虽然这个命令不是很重要。但是它其实还是很有用的,不是吗?

当然,有人会说,你这个都是在一个目录下,那我要是在不同的目录下呢?

聪明的朋友会说,用两个命令。一个find先把要修改的文件找出来,再接一个管道,一个rename不就完了吗?

是的,上述办法可以说是一种思路,其实有很多种思路。老师的那篇博文里面讲的已经很详细了,大家只需要到那里面学一种就ok了。其他的作为了解也未尝不可。

下面我附加一点内容,

查看rename版本的信息

[root@Jason64-17 net]# man rename | head -1
RENAME(1)                  Linux Programmer’s Manual                 RENAME(1)

仅代表个人看法,如果有异议的,请留言交流。勿喷~ 谢谢!