为什么我的递归 grep 不起作用?

为什么我的递归 grep 不起作用?

我在父目录中,想要搜索任何包含短语“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

所有这些文件系统对象(eclipsescripts等)都是文件夹。

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 文件不会有任何用处,因为它们实际上是压缩的。有两个不便之处:

  1. zipgrep命令不接受多个档案名称作为参数,因此您必须循环遍历所有 ODT 文件。
  2. 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,并且逻辑与 ( ) 后的命令&&被执行,因此文件名会在终端上回显。

相关内容