패턴이 있는 파일을 검색하려고 합니다 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
패턴과 일치하는 줄이 있는 파일에 해당하는 경로 이름을 가져오는 두 가지 옵션이 있습니다.
경로 이름을 출력 해 보겠습니다
find
.find . -name '*FW*' -type f \ -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
이것은
grep
발견된 각 파일에서 개별적으로 실행된 다음 패턴과 일치하는 항목이 포함된 각 파일의 경로 이름을 인쇄합니다. (그런데, 답변의 다른 모든 항목은 표준을 준수하는 두 개의 별도 기본 정규식 세트로 전환되었습니다. 표준이었습니다).이것은 아마도 터미널에서 경로명을 인쇄하는 것 외에 경로명에 대해 다른 작업을 수행하려는 경우 사용하고 싶을 것입니다(더 많은
-exec
작업을 추가하기만 하면 됩니다).경로 이름을 출력 해 보겠습니다
grep
.find . -name '*FW*' -type f \ -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
이는
grep
발견된 파일의 일괄 처리에서 실행됩니다. 유틸리티 는 ("dash-ell") 옵션이grep
주어지면 일치하는 각 파일의 경로 이름을 보고합니다 .-l
이는 수행되는 호출 수를 최소화하므로 더 빠르게 실행될 가능성이 높으며
grep
원하는 경우 수행할 작업입니다.바라보다경로 이름에.