サブディレクトリから拡張子を持つすべてのファイルを再帰的にgrepしたいが、csv
4M未満のサイズのファイルのみを選択します。これは正しいことですか?
find . -type f -size -4M | grep --include \*.csv 'pattern'
このコマンドは、.csv
デフォルトでは4M未満のサイズに制限なくすべてのファイルを選択しますが、find
個別には4M未満のすべてのファイルを正しく検索します。
ベストアンサー1
まず、偽データを設定します。
$ for fileno in {1..4}; do for line in {1..100000}; do printf "%d,%d,%d,%d,%d,%d,%d,%d\n" $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM; done > ~/tmp/big-fake-${fileno}.csv; done
$ for fileno in {1..4}; do for line in {1..50000}; do printf "%d,%d,%d,%d,%d,%d,%d,%d\n" $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM; done > ~/tmp/small-fake-$fileno.csv; done
興味のある属性があるかどうかを確認しましょう。
$ du -b tmp/*.csv
4528666 tmp/big-fake-1.csv
4529227 tmp/big-fake-2.csv
4529173 tmp/big-fake-3.csv
4528782 tmp/big-fake-4.csv
2263714 tmp/small-fake-1.csv
2264028 tmp/small-fake-2.csv
2264398 tmp/small-fake-3.csv
2265134 tmp/small-fake-4.csv
さて、小さなファイルでいくつかのパターンを見つけましょう。
$ find tmp/ -type f -iregex ".*\.csv" -size -4M -exec grep '1,1,1' {} +
tmp/small-fake-3.csv:15361,2526,13438,1083,3224,13221,1,19248
もちろん、grep
ここでは他のフラグも可能です。たとえば、-l
目的のパターンを含むファイル名にのみ興味がある場合です。
これは、「括弧の代わりに{} +
見つかったファイル名のリストを挿入する」のテンプレートと考えることができます。find
Grepは一度に1つずつファイル名のリストを取得することを好むので、-exec grep '1,1,1' {} \;
一度に各個々のファイルに対して新しいGrapインスタンスを起動するよりも優れています。
私の考えでは、このロゴは他のタイプのロゴ-exec
と同様にGNU-ismだと思います。 (誰かがこれについて詳しく説明するコメントを投稿すると確信しています。)find
find -print0 | xargs -0