日知录

学而不思则殆

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

更多讨论可以参考下面的链接:

  1. http://serverfault.com/questions/205499/how-to-do-dos2unix-to-tpl-recursively-in-linux
  2. http://stackoverflow.com/questions/11929461/dos2unix-command-on-entire-directory
  3. http://stackoverflow.com/questions/5607542/why-does-find-exec-mv-target-not-work

非常感谢 @Alf 童鞋的善意提醒。 :-)

Comments

使用Disqus评论 使用多说评论
comments powered by Disqus