- 论坛徽章:
- 0
|
本帖最后由 junhengwoo 于 2015-11-21 11:15 编辑
我喜欢把一些稍微复杂的操作组合成只有一行的命令,然后定义为别名,这样想用的时候,通过使用这个别名再加上一些参数值,就能快速地完成一些功能。
问题是这样的。
我想在当前目录(以及所有的子目录)下的所有文本文件中搜索一个指定的字符串,把包含这个字符串的行打印出来。
我当前的实现方式如下:
alias findt=" find ./ -type f 2>/dev/null | xargs file 2>/dev/null | grep ASCII | cut -d ':' -f 1 | xargs grep "
使用方式如下:
jack@Ubuntu:~/temp9$ findt "steven"
./temp/aaaaa:hi steven
./temp/bbbb:by steven
在文件名中没有包含“:”字符时,那么结果是正常的。
如果文件名包含了“:”字符,那么这样执行就会出现错误。如下面的示例中是因为有文件名为“cc:dd”,导致出现下面的错误。
jack@Ubuntu:~/temp9$ findt "steven"
grep: ./temp/cc: No such file or directory
错误的原因,是因为在对“file 文件名”的操作结果通过cut的分隔符“:”来分割时提取的第一个域不是文件名,导致grep出错。
我把这个操作中的一部分的执行结果贴出来,这样大家能好理解些。
jack@Ubuntu:~/temp9$ find ./ -type f 2>/dev/null | xargs file 2>/dev/null | grep ASCII
./temp/cc:dd: ASCII text
我也曾考虑过通过awk来解决这个问题,但是awk中的单引号和双引号在alias中会被展开,导致会出错,所以放弃了这个思路。
请各位大神帮忙看看这个问题如何解决? |
|