grep은 파일에서 여러 문자열을 찾은 다음 크기 순서대로 파일을 나열합니다.

grep은 파일에서 여러 문자열을 찾은 다음 크기 순서대로 파일을 나열합니다.

나는 많은 파일이 .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

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에게 한 줄에 하나의 파일을 나열하도록 지시하고 -Sls에게 이름이 아닌 파일 크기별로 정렬하도록 지시합니다.

편집하다이런, OR(질문을 잘못 읽음)입니다.

이 경우 두 개의 grep을 사용하도록 Sputnick의 솔루션을 수정하십시오.

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

(적어도 한 바퀴 돌았으니 du프로세스 sort가 하나 줄었습니다.)

관련 정보