それぞれ数千のファイルを含む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
パターンを使用して呼び出そうとするとクラッシュします。grep
cdr/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
強制するか、次を使用できます。grep
find
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
この問題はありません。
答え2
問題は、シェルコマンドで許可される最大バイト数の制限です。
*
ディレクトリ内のすべてのファイルの完全なリストに展開されるため、重要なファイルサイズではなく、ファイル名の長さとファイル数が重要です。
を実行してコンピュータのバイト制限を確認できます$ getconf ARG_MAX
。この制限は、シェル自体ではなくオペレーティングシステム/カーネルによって適用されます。
これを防ぐ1つの方法はfindを使用することです。
$ find cdr/173/07/ -iname "cdr_2018_07*" -type f -exec grep "IP" {} \;
答え3
私は次の点に基づいて質問に答えています。 - 2つのディレクトリがあります。 - 1)cdr/173/07 2)cdr/173/06
これら2つのディレクトリには、検索する必要があるファイルがたくさんある場合があります。
a) 以下は最初の解決策です。
grep -r "IP" cdr/173/07 -e "IP" cdr/173/06
b) ただし、他の多くのディレクトリを検索するには、次のものを使用できます。
grep -r "IP" cdr/173/*
c)1000個のファイルがあり、特定の種類のファイルのみを検索するとします。 grep -r "IP" cdr/173/07/cdr_2018_07* -e grep "IP" cdr/173/06/cdr_2018_06*