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