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つは、ファイルのリストがソートされないことです。