![为什么我的递归 grep 不起作用?](https://linux22.com/image/1387869/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%E9%80%92%E5%BD%92%20grep%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我在父目录中,想要搜索任何包含短语“GWT”的 ODT 文件(LibreOffice Writer)。
我在 Ubuntu 12.04 桌面上。从终端:
myUser@myMachine:~/sandbox$ pwd
/home/myUser/sandbox
myUser@myMachine:~/sandbox$ ls
cloudflip doctrang eclipse lookslike scripts squirrel warlib
所有这些文件系统对象(eclipse
、scripts
等)都是文件夹。
myUser@myMachine:~/sandbox$ grep -i -r "GWT" *.odt
grep: *.odt: No such file or directory
我要去哪里?提前谢谢!
答案1
ODT 文件实际上是 Zip 文件(参见https://stackoverflow.com/questions/4957212/how-does-open-office-compress-its-files)你应该能够使用zipgrep
以下命令来 grep 它们:
find ~/sandbox -name "*.odt" -type f -print0 | xargs -0 zipgrep GWT
答案2
假设您使用 Bash 4,您可以执行以下操作:
shopt -s globstar
grep -i GWT **/*.odt
shopt -u globstar
当 shell 选项全球星已设置,**递归匹配当前目录的所有子目录。第二个购物命令取消设置命令;此步骤是可选的。
正如 @vanthome 指出的那样,查找 ODT 文件不会有任何用处,因为它们实际上是压缩的。有两个不便之处:
- 这zipgrep命令不接受多个档案名称作为参数,因此您必须循环遍历所有 ODT 文件。
- zipgrep将仅打印匹配的行(可以是非常由于 ODT 文件中的字符串很长,因此您仍然不知道哪些文件包含该字符串。
以下做法可能会达到预期的效果:
shopt -s globstar
for file in **/*.odt; do
unzip -c "$file" | grep -iq GWT && echo "$file"
done
shopt -u globstar
这为了循环遍历所有子目录中的所有 ODT 文件。对于找到的每个文件,它会将其内容解压到 STDOUT。然后,grep搜索所需字符串而不输出任何内容 ( -q
)。如果找到匹配项,grep返回 0,并且逻辑与 ( ) 后的命令&&
被执行,因此文件名会在终端上回显。