HP-UXの複数のファイルから文字列を検索する

HP-UXの複数のファイルから文字列を検索する

shコマンドとシステムコマンドのみを使用してください(Perlいいえオプション)。

一部のファイルでは、このコマンドは正しく機能します。

# grep -l word *
file 1
file1

ただし、270,000個のファイルがあると、次のエラーが発生します。

#  grep -l word *
sh: /usr/bin/grep: The parameter list is too long.

HP-UXでは、このxargsコマンドにはこのオプションがないため-0使用できません。

# find . -print0 |xargs -0 grep -l
xargs: unknown option: -0

どのコマンドを使用できるかわかりますか?

答え1

find次のようにコマンドのバリアントを使用できます。

find . -type f -exec grep -l word {} \; 

答え2

HP-UXのバージョンが十分に最新の場合は、findこの-exec … +操作を使用して呼び出すことができます。これはxargs、コマンドラインの長さの制限を超えずに一度に複数の一致するファイルに対してコマンドを呼び出すのと同じことを行いますが、すべてのファイル名に対して安定した方法です。

find . -type f -exec grep -l word {} +

HP-UXのバージョンが古すぎる場合-exec … \;-exec … +;

find . -type f -exec grep -l word {} \;

ファイル名に\"'スペースが含まれていない場合は、xargsこのオプションを使用する必要はありません-0

find . -type f -print | xargs grep -l word

答え3

grep -l word ./*引数のサイズ制限を避けるために、必要に応じてファイルのリストを分割するのと同様の近いPOSIXの場合は、次のようにexecve()します。

find -L . ! -name . -prune ! -name '.*' -type f -exec \
  grep -l word /dev/null {} +
  • ! -name . -pruneサブディレクトリには再帰的ではありません。
  • -L通常のファイルでのみ検索することと一緒に使用されます(シンボリックリンク分析後)(-type fこれはすべての種類のファイルを見つける方法と比較して利点です)。grep ... ./*
  • ! -name '.*'./*隠しファイルを除外
  • /dev/nullファイル名が常に印刷されることを確認してください(別のボーナス)。

注目すべき違いの1つは、ファイルのリストがソートされないことです。

関連情報