2016-12-30 2 views
7

私は100,000以上のファイルを持つディレクトリを持っています。文字列"str1"がこれらのファイルの内容の一部として存在するかどうかを知りたい。grep - 読み取るファイル数の上限

コマンド: grep -l 'str1' *は、すべてのファイルを読み取るには時間がかかります。

grepに一致するものが見つかると、それ以上のファイルの読み取りを停止するにはどうすればよいですか?どんな1ライナーですか?

注:私はgrep -l 'str1' * | headを試しましたが、コマンドは以前のものと同じくらい時間がかかります。

+0

このコマンドは、ファイル数の少ないディレクトリで動作しますか? –

+0

多分、既にここで答えられました:http://stackoverflow.com/questions/14093452/grep-only-the-first-match-and-stop –

+0

'head -1'はトリックを行います –

答えて

5

コマンド引数に100,000個のファイル名を命名すると問題が発生します。シェルコマンドラインのサイズを超えている可能性があります。

しかし、あなたはファイルが(あなたは、現在のディレクトリ内のファイルを検索したい場合は.である)にあるディレクトリの名前だけで再帰的なオプションを使用する場合、すべてのファイルに名前を付ける必要はありません。

grep -l -r 'str1' . | head -1 
+0

'-r'はあまり標準的ではないことを除いて... –

+0

ちょっと余計なことに、' LC_ALL = "C" grep -m1 -l -r 'str1'で投げます。 | head -1' – bishop

+2

@gniourf_gniourf、OPの質問には[tag:linux]とタグ付けされているので、彼らがGNU grepを使っていると想定するのは安全だと思います。 –

3

を使用すると、ファイル内で最初に一致するものを見つけた後にgrepが停止します。大きなテキストファイルの場合は非常に効率的です。

grep -m 1 str1 * /dev/null | head -1 

1つのファイルがある場合、上記の/ dev/nullはgrepが出力にファイル名を出力することを保証します。

あなたが任意のファイルの最初の一致を検出した後に停止する場合:あなたが多数のファイルとディレクトリを持っているときforループもtoo many arguments問題からあなたを節約

for file in *; do 
    if grep -q -m 1 str1 "$file"; then 
    echo "$file" 
    break 
    fi 
done 

+0

非常に良い。私は1つのライナーを見つけることを望んでいましたが、これらのステートメントは行います。 – user2070775

+1

OPはすでに '-l'を使っていますので、最初にマッチした後で' grep'を止めることに注意してください。 –

+1

'for file in *'は "引数が多すぎます"ということは決してありません。回避策です。例えば、http://www.in-ulm.de/~mascheck/various/argmax/ –

関連する問題