我在一个有很多.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 每行列出一个文件,并-S
告诉 ls 按文件大小而不是名称排序。
编辑哎呀,这是一个 OR(误读了问题)。
在这种情况下,对 sputnick 的解决方案进行修改以使用两个 grep
grep -l stringA * | xargs grep -l stringB | xargs -ls -1S
(至少绕了一圈du
,sort
少了一个过程:)