Linux通过shell实现递归列目录及对文件的处理
这是我在博客园的博客中的文章。
下面是原文(未大改,稍作了一些格式上的调整):
之前本子一直是windows 7和Linux双系统,后来把windows 7换成了windows xp,而xp的试用期过了之后,却再也进不了xp系统了。我记得windows 7就算过期后,至少系统还能进,只不过黑黑屏而已,但是xp却是直接连系统都不让进了。这让我很不爽,于是,一怒之下,在上周末把硬盘格了,全部换成ext分区,全部装上Linux。
在我把vim的一些插件从windows迁移过来时,在打开vim时很自然地报了E492: not an editor command: ^M的错误。因为插件中有dos格式的。
我随便打开一个插件,发现就是dos格式的,如果人工把这些插件转换成unix格式的话。。。那我今天晚上又不用睡觉了。(PS:昨天晚上因为搞挂了一台机器直接导致我三点多才睡)
记得Linux下有个 dos2unix 的小工具,但看了下文档,只支持文件格式的转换,不支持对目录的批量转换。。。
好吧,那看来得自己写个shell脚本处理了,这对强大的shell来说只是个小case:
#!/bin/bash function batch_convert() { for file in `ls $1` do if [ -d $1"/"$file ] then batch_convert $1"/"$file else dos2unix $1"/"$file #echo $1"/"$file fi done } batch_convert ~/.vim
保存为sh,然后加上可执行属性,运行一下,整个.vim文件夹内的所有文件就都被转换好了。
再打开vim,再也没有那烦人的E492: not an editor command: ^M错误了。
GR的M$,非要搞另类。
更新:
经过评论中 @Alf 童鞋的提醒,上面的实现在文件或者文件夹有空格时会产生bug,而且上面的功能可以直接通过 find
命令加上 -exec
选项或者配合 xargs
命令来实现,简单易用还不会出错,一个可行的方案如下(可以很好地处理文件空格):
find ~/.vim -type f -print0 | xargs -0 dos2unix
更多讨论可以参考下面的链接:
- http://serverfault.com/questions/205499/how-to-do-dos2unix-to-tpl-recursively-in-linux
- http://stackoverflow.com/questions/11929461/dos2unix-command-on-entire-directory
- http://stackoverflow.com/questions/5607542/why-does-find-exec-mv-target-not-work
非常感谢 @Alf 童鞋的善意提醒。 :-)