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
私が使用できるコマンドを知っていますか?
次のようなfind
コマンドの変形を使用できます。
find . -type f -exec grep -l Word {} \;
ご使用の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
を使用すると、ファイル名が常に印刷されます(別のボーナス)。顕著な違いは、ファイルのリストがソートされないことです。