再帰 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/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

シェルオプショングロブスター設定され、**現在のディレクトリのすべてのサブディレクトリを再帰的に一致します。2番目のショップコマンドはコマンドの設定を解除します。この手順はオプションです。

@vanthome が指摘しているように、ODT ファイルは実際には圧縮されているため、grep しても意味がありません。不便な点が 2 つあります。

  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に展開します。次に、グレップ何も出力せずに目的の文字列を検索します(-q)。一致するものが見つかった場合、グレップ0 を返し、論理 AND ( ) の後のコマンドが&&実行され、ファイル名が端末にエコーされます。

関連情報