패턴이 있는 파일을 검색하려고 합니다 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
일괄적으로 발견된 파일에 대해 작동합니다. 유틸리티는grep
("dash-ell") 옵션을 기반으로 일치하는 각 파일의 경로 이름을 보고합니다.-l
grep
원하는 경우 호출 수를 최소화하므로 아마도 더 빠르게 실행될 것입니다.바라보다경로 이름에.