搜索此博客

显示标签为“Shell”的博文。显示所有博文
显示标签为“Shell”的博文。显示所有博文

2009年8月7日星期五

Dos/Mac文本文件转换成Unix格式

sed –e'$!s/\r$//g' –e's/\r/\n/g' -i filename

有个问题,Dos格式转换完最后一行会有两个“\n”。如果去掉“$!”的话,Mac格式就有问题了,最后一行没有“\n”。

2009年7月14日星期二

用 split 命令分割文件

今天看了个syslog,40M的gz,用vim愣是打不开。俺的内存是1G的啊。用gzip解开,640多MB。网上若干同仁(估计是互相抄的)都说用dd,1次只能拆一段,而且还得自己算偏移量。正常的方法应该用split命令。manpage我就不抄了,写几个例子。

  • split -l 10000 bigfile
  • split -b 10M bigfile
  • zcat bigfile.gz | splite -a 3 -d - BIG

文件名后面的是前缀,-a是后缀,-d表示序号按数字排,默认是字母。-l是按行数分割,-b是按字节数。

“ls *.tmp”是啥意思?

想列出目录里所有“.tmp”结尾的文件,很自然就会想到“ls *.tmp”,觉得ls就是干这个用的。到最近才忽然明白,这样做虽然能达到目(通常情况下),但实际并不是这么回事!

启发我的问题是这样的。当时目录里充满的垃圾文件,我用rm去删除,“rm *.tmp”,但是根本不起作用,shell提示说命令行超长了。bash的命令行最大长度是4096byte。当输入“rm *.tmp”时,bash会先进行通配符展开。把“*.tmp”展开,也就是把所有“.tmp”文件的文件名链接到“rm”后面。一旦文件有多,文件名又长,整个命令行就超标了,bash拒绝接受!

解决问题的方法:

  1. echo *.tmp | xargs rm
  2. find –name '*.tmp' –delete

要注意的是,“rm *.tmp”和“echo *.tmp | xargs rm”不会删除“.tmp”的子目录,删子目录需要“-r”,而find会删除子目录,除非加上“-type f”参数。

对于“echo *.tmp | xargs rm”,我还是有疑问的。难道echo *.tmp就不会有通配符展开的问题了吗?不知道,echo是bash内建的命令,而且反正echo也是把匹配的文件名写出来而已,也许真的不用展开。

好了,现在回到“ls *.tmp”的话题上来。和上面一样,命令执行时先通配符展开——好了,实际上我要做的事情并不是ls做的,而是bash,通配符展开的时候“.tmp”文件就已经被bash找出来了。最终执行的命令应该象是这样“ls 1.tmp 2.tmp 3.tmp … …”。

2008年7月11日星期五

用Cscope帮助Vim浏览代码


  1. 建立cscope.out的脚本makecs.sh,makecs.sh 。

  2. #/bin/bash

    TEMPLATE=cscope.XXXXXX

    if [ -n "$1" ]; then
    cd "$1";

    TEMP_FILE=$(mktemp "$TEMPLATE")
    find -regex '.*\.\([ch]\|[ch][px][px]\|pgc\)' | grep -v '.svn' > "$TEMP_FILE"
    cscope -b -i "$TEMP_FILE"

    rm "$TEMP_FILE"
    else
    echo "makecs <dir>"
    exit 1
    fi

  3. Cscope插件

  4. autoload_cscope,放在./vim/plugin/或者/usr/share/vim/vim70/plugin/。我下的是0.3,78行的“find c”改成了“find s”,在175、176行加入了*.pgc。
  5. 用法

  6. C-] = 查定义

    C-\, s = 查引用

    C-\, c = 查调用