grep はファイル内の複数の文字列を検索し、サイズ順にファイルを一覧表示します。

grep はファイル内の複数の文字列を検索し、サイズ順にファイルを一覧表示します。

私は多くのファイルが.txtあるフォルダにあり、両方のファイルを含むすべてのファイルstringAstringB必ずしも同じ行にある必要はありません)を見つけて、ファイルをサイズ順(最も小さいものから大きいものまで)としてリストしたいと思います。

以下を試しましたが、動作しません。

ls -lS | for f in *; do grep -q stringA $f && grep -l stringB $f; done

誰にも良いアイデアがありますか?

答え1

あなたはそれを使用することができますGNU find

find . -maxdepth 1 -exec grep -q stringA {} \; -exec grep -q stringB {} \; \
        -printf '%10s %p\n' | 
    sort -n

答え2

使用(ポータブルでファイル名にスペースの問題はありません):

perl -Mautodie -wle '
    for (<"*.txt">) {
        open my $fh, "<", $_;
        my @list = <$fh>;
        close $fh;
        if (grep { /stringA/ } @list and grep { /stringB/ } @list) {
            $h->{$_}->{size} = (stat($_))[8];
        }
    }
    END{
        print join "\n", sort { $h->{$a}->{size} <=> $h->{$b}->{size} } keys %$h;
    }
'

答え3

zshGNUツールの使用:

grep -lZ -- stringA *.txt(oL) | xargs -r0 grep -l -- stringB

答え4

 egrep -l '(stringA|stringB)' * | xargs ls -1S

egrep正規表現が許可されているので、上記はすべてのファイルからstringAまたはstringBを検索します。この-lオプションは、egrepに一致するファイルのみを出力するように指示します(一致する行の出力を抑制します)。これをパイプで接続すると、xargs ls -1S一致するすべてのファイルがに渡されますls -1S-1lsに1行に1つのファイルをリストするように指示し、-Slsに名前ではなくファイルサイズでソートするように指示します.

編集するこういう、OR(質問を誤って読んだ)です。

この場合、2つのgrepを使用するようにSputnickのソリューションを修正してください。

grep -l stringA * | xargs grep -l stringB | xargs -ls -1S

(少なくとも一輪回ったのでduプロセスsortが一つ減りました。)

関連情報