sh와 함께 find 사용 - 명령이 작동하지 않습니다.

sh와 함께 find 사용 - 명령이 작동하지 않습니다.

패턴이 있는 파일을 검색하려고 합니다 FW. 필터링된 파일에서 패턴을 검색 chmod.*archive|archive.*chmod한 다음 나열하려고 합니다 .

다음 명령을 사용해 보았으나 원하는 결과가 나오지 않았습니다. 이 문제를 해결하는 데 도움이 필요합니다.

find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more

답변1

내가 올바르게 이해했다면 필요한 것은 다음과 같습니다.

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls

이는 grep발견된 각 파일의 패턴에 대한 도움말을 제공 find하고, grep성공 하면 ls -l.

답변2

@terdon의 제안 대신 다음 명령을 사용할 수도 있습니다.

grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW

편집하다

@Kusalananda가 지적했듯이:

파일이 이름에 FW가 포함된 디렉터리에 있으면 이 작업이 실패합니다(잘못된 출력 제공).

올바르게 작동하도록 조정하면 읽기가 훨씬 어려워집니다. @terdon이 제안한 솔루션은 더 유리한 옵션입니다(그리고 더 효율적입니다 - @tedron의 의견 참조).

그러나 수정된 ​​버전은 다음과 같습니다.

grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'

답변3

패턴과 일치하는 줄이 포함된 파일에 해당하는 경로 이름을 가져오는 두 가지 옵션이 있습니다.

  1. 출력 경로 이름을 지정하십시오 find.

    find . -name '*FW*' -type f \
        -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
    

    이것은 grep발견된 각 파일에서 개별적으로 실행된 다음 패턴 일치를 포함하는 각 파일의 경로 이름을 인쇄합니다(그런데 답변의 다른 모든 것이 표준이기 때문에 이것을 표준을 따르는 두 개의 별도 기본 정규식 세트로 변환했습니다) .

    -exec경로명을 터미널에서 인쇄하는 것 외에 다른 작업을 수행하려는 경우(더 많은 작업을 추가하기만 하면 됩니다) 이 방법을 사용할 수 있습니다.

  2. 출력 경로 이름을 지정하십시오 grep.

    find . -name '*FW*' -type f \
        -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
    

    이는 grep일괄적으로 발견된 파일에 대해 작동합니다. 유틸리티는 grep("dash-ell") 옵션을 기반으로 일치하는 각 파일의 경로 이름을 보고합니다.-l

    grep원하는 경우 호출 수를 최소화하므로 아마도 더 빠르게 실행될 것입니다.바라보다경로 이름에.

관련 정보