grepは、他のファイルパスではなく1つのファイルパスに対して機能します。

grepは、他のファイルパスではなく1つのファイルパスに対して機能します。

それぞれ数千のファイルを含む2つのディレクトリがあり、ファイルから特定のIPを収集しようとしています。私のgrep文字列は次のようになります

grep "IP" cdr/173/07/cdr_2018_07*

この grep 文字列は、「grep: 引数リストが多すぎる」を返します。ただし、次のことを行うとき:

grep "IP" cdr/173/06/cdr_2018_06*

私が探しているものを返します。

以下は、各ディレクトリの親ディレクトリのls -lです。違いが約400KBだと思うので、ここではサイズが実際に問題なのかよくわかりません。私は何を逃したことがありませんか?

jeblin@debian:~$ ls -l cdr/173
total 18500
REDACTED
drwxr-xr-x 2 jeblin jeblin 2781184 Jul  2 09:34 06
drwxr-xr-x 2 jeblin jeblin 2826240 Aug  1 07:33 07

違いがある場合は、このプロセス(複数のIP検索)を自動化するためにPythonスクリプトを作成しました。

ベストアンサー1

シェルが呼び出すことができないファイルが多すぎるか、むしろ外部ユーティリティを呼び出すために使用されるコマンドラインの長さに制限があり、1、シェルが拡張グローブgrepパターンを使用して呼び出そうとするとクラッシュします。grepcdr/173/07/cdr_2018_07*

あなたができることは、各ファイルを個別にgrepすることです。

for pathname in cdr/173/07/cdr_2018_07*; do
    grep "IP" "$pathname" /dev/null
done

ここで、 extra は、一致するファイルのファイル名を常に報告するよう/dev/null強制するか、次を使用できます。grepfind

find cdr/173/07 -maxdepth 1 -type f -name 'cdr_2018_07*' \
    -exec grep "IP" /dev/null {} +

grepできるだけ多くの一致するパス名を使用して呼び出しが行われるため、この方法はより効率的です。できるだけ一括で。

cd最初に入ってみるとcdr/173/07そうかもしれません。

grep "IP" cdr_2018_07*

それ可能ディレクトリビットが含まれていないため、結果のファイル名のリストが短くなる可能性があるため、おそらく44.7kファイルの制限に非常に近いので、特に数値が予想される場合は、これを行う他の方法に進むことを真剣に検討する必要があります。ファイル数が対応する数字の周りで変動します。

関連:


1制限はコマンドラインの長さと環境(各引数の長さと環境変数の名前と値の合計、対応するポインタも考慮)これは、execve()外部コマンドを実行するためにシェルによって使用されるシステムコールによって課される制限です。などの組み込みコマンドにはechoこの問題はありません。

おすすめ記事