免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3311 | 回复: 11
打印 上一主题 下一主题

[文件目录] 一个困惑我了很久的问题,请各位大神帮我看看【已完美解决】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-02 18:26 |只看该作者 |倒序浏览
本帖最后由 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中会被展开,导致会出错,所以放弃了这个思路。

请各位大神帮忙看看这个问题如何解决?

论坛徽章:
0
2 [报告]
发表于 2015-11-02 18:36 |只看该作者
在线等各位大神的指导   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
3 [报告]
发表于 2015-11-02 19:12 |只看该作者
回复 1# junhengwoo

grep -r "steven" *
不能达到你的要求吗?

   

论坛徽章:
0
4 [报告]
发表于 2015-11-02 19:38 |只看该作者
谢谢  
你的这个方式很好,不过我要找的范围很大(比如从根目录去找),所以首先要把文本类型的文件给过滤出来,缩小要查找的范围,这样使用grep去搜索的效率会高一些。

回复 3# Herowinter


   

论坛徽章:
0
5 [报告]
发表于 2015-11-02 20:15 |只看该作者
我现在把管道给拆了,查到的文件信息放到一个临时文件里,然后对文件进行处理,可以达到目的,但是这种方式有些丑陋了,最后还留下了一个临时文件没有删掉。
jack@Ubuntu:~/temp9$ alias findt='find ./ -type f 2>/dev/null | xargs file   2>/dev/null | grep ASCII > temp.txt; while read LINE; do n=`echo $LINE | grep -o : | wc -l`; echo $LINE | cut -d :  -f 1-$n; done <temp.txt | xargs grep -H '
jack@Ubuntu:~/temp9$ findt steven
./temp/cc:dd:steven, you are so nice.
junheng.wu@Tizen-PVR:~/temp9$

应该还有更好的解决方案

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
6 [报告]
发表于 2015-11-03 09:26 |只看该作者
复杂的写成脚本 放 /usr/bin 或 /usr/local/bin 或 ~/bin 下面,别用alias了

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
7 [报告]
发表于 2015-11-03 13:59 |只看该作者
Bash manual 说了:能用函数尽量用函数,不要用别名

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
8 [报告]
发表于 2015-11-05 08:24 |只看该作者
grep ASCII | cut -d ':' -f 1 变为 sed  -n 's/: ASCII text$//p'

论坛徽章:
0
9 [报告]
发表于 2015-11-10 09:14 |只看该作者
本帖最后由 lgfang 于 2015-11-10 09:15 编辑

我的file支持‘-F’ (如果你的file也支持只是你没查手册的话,建议养成遇到问题先查手册的习惯)。
  1.      -F, --separator separator
  2.              Use the specified string as the separator between the filename and the file result returned. Defaults to ‘:’.


  3. $ alias findt=" find ./ -type f 2>/dev/null | xargs file   2>/dev/null | grep ASCII | cut -d ':' -f 1 |  xargs grep "

  4. $ findt

  5. $ findt aaaa
  6. grep: ./cc: No such file or directory

  7. $ alias findt=" find ./ -type f 2>/dev/null | xargs file -F '|'   2>/dev/null | grep ASCII | cut -d '|' -f 1 |  xargs grep "

  8. $ findt aaaa
  9. aaaaa
复制代码

论坛徽章:
0
10 [报告]
发表于 2015-11-21 11:09 |只看该作者
回复 8# waker

谢谢waker哥的指点

按照这种方式,现在不报错了,但结果跟我期望的不太一样。
zxin10@ubuntu:~/temp2$ alias findt3=" find ./ -type f 2>/dev/null | xargs file   2>/dev/null | sed  -n 's/: ASCII text$//p' |  xargs grep "
zxin10@ubuntu:~/temp2$ findt3 steven
by,steven
zxin10@ubuntu:~/temp2$ findt2 steven
./a/b/c/BB:CC:hello, steven
./a/b/c/dd.txt:by,steven


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP