LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1396|回复: 13

Cscope 处理文件名中的空格

[复制链接]
发表于 2011-5-28 15:17:53 | 显示全部楼层 |阅读模式
大家好,
    我写了以下脚本来包cscope,用来读代码。
      
  1. #!/bin/bash
  2. TARGET='/export/home1/username/cscope_db/cscope.files'
  3. find `pwd`/ -type f -name "*.h" -o -name "*.py" -o -name "*.xml" -o -name "*.properties" -o -name "*.jsp" -o -name "*.c" -o -name "*.cc" -o -name "*.cpp" -o -name "*.hpp" -o -name "*.java" -o -name "*.js"> ${TARGET}
  4. cscope -qR -i "${TARGET}"
复制代码

      但是,它在处理文件名中包含空格的文件时,会出现问题,像下面这样的文件名
   
  1. /home/huangyingw/cvs/design/UED/DE Sample Index/3.2/Samples/CPP/SharingData/Client/_notes/dwsync.xml
复制代码

    就被cscope当成了两个文件来处理,进而报错。
   这样很影响我阅读代码。
   有人能帮我改进一下我的脚本吗?
发表于 2011-5-28 23:13:04 | 显示全部楼层
根据cscope的手册,
-i namefile
    Browse through all source files whose names are listed in namefile (file names separated by spaces, tabs, or new-lines) instead of the default (cscope.files). If this option is specified, cscope ignores any files appearing on the command line. The argument namefile can be set to ``-'' to accept a list of files from stdio. Filenames in the namefile that contain whitespace have to be enclosed in "double quotes". Inside such quoted filenames, any double-quote and backslash characters have to be escaped by backslashes.


先把文件名里含有单引号/双引号/斜杠进行转义,然后给文件名加上双引号。
find 句加上
  1. |sed 's/\(["'\''\]\)/\\\1/g;s/^/"/;s/$/"/'
复制代码
改成:


  1. find `pwd`/ -type f -name "*.h" -o -name "*.py" -o -name "*.xml" -o -name "*.properties" -o -name "*.jsp" -o -name "*.c" -o -name "*.cc" -o -name "*.cpp" -o -name "*.hpp" -o -name "*.java" -o -name "*.js" |sed 's/\(["'\''\]\)/\\\1/g;s/^/"/;s/$/"/' > ${TARGET}
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-29 15:25:51 | 显示全部楼层
大侠,太感谢了。
顺便再问个问题:-o -name "*.py" -o -name "*.java",,这些,能写到一个文件里,这样让这个脚本去读这个文件吗?这样,我就可以根据不同的项目情况,去解释不同的后缀文件?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-29 15:27:07 | 显示全部楼层
还有一个问题,cscope能否像VI一样,对代码,特别是查找结果(ctrl+\+s),对关键词进行颜色高亮?这样,在看查找结果时,要省力些。
回复 支持 反对

使用道具 举报

发表于 2011-5-29 16:40:10 | 显示全部楼层
Post by huangying;2141045
大侠,太感谢了。
顺便再问个问题:-o -name "*.py" -o -name "*.java",,这些,能写到一个文件里,这样让这个脚本去读这个文件吗?这样,我就可以根据不同的项目情况,去解释不同的后缀文件?

假如/tmp/a里记录文件后缀:
  1. c
  2. cpp
  3. h
  4. hpp
复制代码

find 命令可以写成:

  1. find -type f $(cat /tmp/a|{ read suf; echo -n "-name *.$suf";while read suf;do echo -n " -o -name *.$suf";done; })
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-29 17:10:06 | 显示全部楼层
  1. #!/bin/bash
  2. TARGET='/export/home1/username/cscope_db/cscope.files'
  3. FILE_POSTFIX=$HOME/bashrc/vitag_postfix
  4. find `pwd`/ -type f $(cat ${FILE_POSTFIX}|{ read suf; echo -n "-name *.$suf \";while read suf;do echo -n " -o -name *.$suf \";done; }) > ${TARGET}
  5. cscope -kqR -i ${TARGET}
复制代码
我这么写,它报:
  1. find: paths must precede expression: \
  2. Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
  3. cscope: no source files found
复制代码
回复 支持 反对

使用道具 举报

发表于 2011-5-29 17:31:17 | 显示全部楼层
因为你在echo -n里加了"\\",所以它报错。另外别忘了用sed 对结果进行处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-29 17:37:11 | 显示全部楼层
我把\\拿掉之后,还是报,
  1. find: paths must precede expression: build.xml
  2. Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
  3. cscope: no source files found
复制代码
回头我会把sed部分加上的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-29 17:42:52 | 显示全部楼层
  1. echo find `pwd`/ -type f $(cat ${FILE_POSTFIX}|{ read suf; echo -n "-name *.$suf";while read suf;do echo -n " -o -name *.$suf";done; })
复制代码
的输出是
  1. find /home/huangyingw/cvs/ -type f -name *.py -o -name build-cs.xml build.xml pom.xml -o -name *.properties -o -name *.jsp -o -name *.js -o -name *.c -o -name find.cc -o -name *.cpp -o -name *.hpp -o -name *.java -o -name *.h
复制代码
看样子,它把当前路径下的*.xml,  *.cc展开了,能教我怎样,别让它展开吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-29 17:44:31 | 显示全部楼层
搞定了,,这样就不会展开了:
  1. echo find `pwd`/ -type f $(cat ${FILE_POSTFIX}|{ read suf; echo -n "-name \*.$suf";while read suf;do echo -n " -o -name \*.$suf";done; })
复制代码
我在*号前面加上\就可以了。
多谢你的指点。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表