
私は多くのファイルが.txt
あるフォルダにあり、両方のファイルを含むすべてのファイルstringA
(stringB
必ずしも同じ行にある必要はありません)を見つけて、ファイルをサイズ順(最も小さいものから大きいものまで)としてリストしたいと思います。
以下を試しましたが、動作しません。
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
zsh
GNUツールの使用:
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
。-1
lsに1行に1つのファイルをリストするように指示し、-S
lsに名前ではなくファイルサイズでソートするように指示します.
編集するこういう、OR(質問を誤って読んだ)です。
この場合、2つのgrepを使用するようにSputnickのソリューションを修正してください。
grep -l stringA * | xargs grep -l stringB | xargs -ls -1S
(少なくとも一輪回ったのでdu
プロセスsort
が一つ減りました。)