web-dev-qa-db-ja.com

HP-UXの多くのファイルの検索文字列

Shとシステムのコマンドのみを使用して、ディレクトリのどのファイル(ファイル名にスペースが含まれる可能性があります)に文字列が含まれるかを見つける必要があります(Perlはnotオプションです)。

いくつかのファイルでは、このコマンドは正常に機能します。

# grep -l Word *
file 1
file1

しかし、270kファイルがある場合、次のエラーが発生します。

#  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

私が使用できるコマンドを知っていますか?

4
Giovanni

次のようなfindコマンドの変形を使用できます。

find . -type f -exec grep -l Word {} \; 
5
Mat

ご使用のHP-UXのバージョンが十分に新しい場合は、-exec … +アクションを使用してfindを呼び出すことができます。このアクションはxargsと同じ働きをします(コマンドラインの長さの制限をオーバーフローすることなく、一致する複数のファイルに対して一度にコマンドを呼び出します)が、どのファイル名に対しても信頼できる方法で行われます。

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

HP-UXのバージョンが古すぎる場合は、-exec … \;のみで-exec … +がない可能性があります。 ;バージョンは、一度に1つのファイルに対してコマンドを呼び出しますが、少し低速です。

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

ファイル名に\"'または空白が含まれていない場合は、-0オプションなしでxargsを使用できます。

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

引数のサイズに対するexecve()の制限を回避する必要があるため、ファイルのリストを分割するgrep -l Word ./*と同等の近いPOSIXの場合は、次のようにすることができます。

find -L . ! -name . -Prune ! -name '.*' -type f -exec \
  grep -l Word /dev/null {} +
  • ! -name . -Pruneはサブディレクトリに再帰しません
  • -L-type fと組み合わせて使用​​すると、通常のファイルのみが検索されます(シンボリックリンクの解決後)(あらゆる種類のファイルの内部を検索するgrep ... ./*アプローチと比較するとおまけ)
  • ! -name '.*'と同様に隠しファイルを除外するには./*
  • /dev/nullを使用すると、ファイル名が常に印刷されます(別のボーナス)。

顕著な違いは、ファイルのリストがソートされないことです。

0