나는 많은 파일이 .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(질문을 잘못 읽음)입니다.
이 경우 두 개의 grep을 사용하도록 Sputnick의 솔루션을 수정하십시오.
grep -l stringA * | xargs grep -l stringB | xargs -ls -1S
(적어도 한 바퀴 돌았으니 du
프로세스 sort
가 하나 줄었습니다.)