LinuxSir.cn,穿越时空的Linuxsir!

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

有关find和xargs egrep组合查询时遇到文件名包含空格的问题,请不吝赐教!谢谢!

[复制链接]
发表于 2008-1-6 17:23:55 | 显示全部楼层 |阅读模式
我们知道用下面这个命令,我们可以查出 所有 包含 "WINDOWS XP" 字符串的文件
find / -type f -iregex ".*" | xargs egrep -li "WINDOWS XP"

但是(这是重点),对于包含空格的目录或者文件名,shell就会把文件路径分成几段发给egrep进行查询,得到结果肯定会有误。

举例说明:

有一目录/sda1,目录结构如下:
/sda1/boot.ini
/sda1/testfolder/boot.ini
/sda1/test folder/boot.ini

我们可以看到,有三个相同的文件boot.ini,这个文件中都包含"Windows XP",但是请注意
第三个文件所在的目录名/test folder/中间包含一个空格,
当我们执行这条命令:find /sda1 -type f -iregex ".*" | xargs egrep -li "WINDOWS XP"
我们只能得到两个文件: /sda1/boot.ini 和 /sda1/testfolder/boot.ini

为什么/sda1/test folder/boot.ini 文件没有被找出来呢?
因为/test folder/目录名中间有个空格,所以这个文件被切割成两部分,交给egrep处理。
也就是说egrep先在/sda1/test里找,结果是没有这个文件,
然后egrep再在folder/boot.ini里找,结果也是没有这个文件,
所以此文件(/sda1/test folder/boot.ini)自然不会被找出来。

我想知道如何才能通过命令找到这个文件?请各位高手赐教!谢谢!



补充:

有人告诉我可以用这条命令:
find /sda1 -type f -iregex ".*" -exec egrep -li "WINDOWS XP" {} \;

这样写虽然大部分情况下可行,但是也存在问题:
因为系统对传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。
错误信息通常是“参数列太长”或“参数列溢出”。
请看:http://www.linuxsir.cn/main/?q=node/137

请大家指教!谢谢!
发表于 2008-1-6 18:12:15 | 显示全部楼层
find . -type f -print0|xargs -0 grep -li "windows xp"
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-6 18:40:38 | 显示全部楼层
十分感谢!解决了我的难题!
回复 支持 反对

使用道具 举报

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

本版积分规则

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