為什麼我的遞歸 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 指出的,grep ODT 檔案不會有任何好處,因為它們實際上是壓縮的。有兩個不方便的地方:

  1. zipgrep命令不接受多個存檔名稱作為參數,因此您必須循環遍歷所有 ODT 檔案。
  2. zipgrep將只列印匹配的行(可以是非常long 在 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 並執行邏輯 AND ( ) 後的命令&&,因此檔案名稱會在終端機上回顯。

相關內容