質問: 多数のpdfファイル内のフレーズを検索するためのコマンドラインツール 私はopensuse10.3を使用しており、ディレクトリ内の多数のpdfファイル内のフレーズを検索するためのコマンドラインツールを知りたいです。 windowsの場合xp explorerの検索ではこれが許可されますが、速度が遅すぎます。ここにgrepのヒントはありますか?
回答: pdfファイル拡張子を持ち、たとえば正規表現「[ii]n haskell」に一致する行を含む、ホームディレクトリ内のすべてのファイルを再帰的に一覧表示するには、次のように発行します。find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -el --label="$pwd${0#?}" "$1"' {} '[ii]n haskell' \; 備考: この例では特に必要ではありませんが、-execまたはxargsの使用を避けてこれを作成しました。これは、 セキュリティ上の理由から 、次のことを行うことをお勧めします。そうする習慣を身につけましょう。 「-execdir」を「-exec」に変更し、「$pwd${0#?}」を「$0」に変更すると、このインスタンスでも同じ結果が得られます。 ファイル名のパターンマッチングに globs を使用する代わりに、 正規表現 のより優れた表現力を使用して、パス全体でパターンマッチングを行うと便利な場合があります。私はそれがどのように行われるかを示すためにここに練習を含めました。パターンが一致するパスは、通常印刷されるパスであることに注意してください。相対か絶対かは、指定されたパス引数によって異なります。パス引数は、発行された場合、デフォルトで現在の作業ディレクトリ( ‘./’)になります。この例では、「/」が現在のユーザーのホームディレクトリの絶対パスに展開され、これが唯一のパスであるため、照合されるパスはすべて絶対パスです(つまり、「~/」で始まります)。引数。 「$0」と「$1」は、引数を正しく引用するように使用される位置パラメータです。これが適切に行われない場合、コマンドは任意のファイル名に対して脆弱です。 「${0#?}」は、$0の最初の文字、つまり「.」を削除します。 ファイル名が続く各一致する行を印刷するには:find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -eh --label="${0:2}" "$1"' {} '[ii]n haskell' \; このバリアントは、「-h」の代わりに「-l」を使用し、ファイルパスではなくファイル名でラベルを付けます。 ‘${0:2}’は$0の最初の2文字、つまり ‘./’を削除しますが、shによって認識されないようです。もちろん、ニーズに合わせて調整してください。