2012-07-19 4 views
10

find를 사용하여 현재 하위 디렉토리에있는 모든 파일 목록을 만들 수 있습니다. 하위 디렉토리 "cache"에있는 파일은 제외됩니다. 첫 번째 코드는 다음과 같습니다.파이핑을 사용하면 빠른 디렉토리 제외를 위해 grep 결과를 찾을 수 있습니다.

find . -wholename './cach*' -prune -o -print 

이제이 코드를 grep 명령으로 파이프합니다. 그것은 단순해야한다고 생각합니다 :

find . -wholename './cach*' -prune -o -print | xargs grep -r -R -i "samson" 

...하지만이 결과는 대부분 캐시 디렉토리에서 반환됩니다. 나는 xargs 레퍼런스를 삭제하려고 시도했으나 파일 자체가 아니라 파일 이름의 텍스트에 grep을 실행하여 기대했던대로 동작한다. 내 목표는 캐시 된 콘텐츠가 아닌 모든 파일에서 "samson"을 찾는 것입니다.

이 예제에서는 이중 greps를 사용하여이 문제를 해결할 수 있지만이 한 행이 왜 이런 식으로 행동하는지 궁금합니다. 나는이 두 가지 명령을 사용하면서 수정하는 방법에 대한 생각을 듣고 싶다. (이렇게하면 속도면에서 이점이있다.)

(이 BTW, CentOS는 5입니다.) 대신 다른 명령에 배관의 발견에

답변

9

wholename 경기가 여전히 "캐시"파일을 포함 왜 이유가 될 수 있습니다. "cache"폴더가있는 디렉토리에서 find 명령을 실행하는 경우 제대로 작동합니다. 그렇지 않은 경우 -name '*cache*'으로 변경하십시오.

또한 grep-r 또는 -R이 필요하지 않습니다. 디렉토리를 통해 반복 되겠지만 개별 파일을 테스트하고있는 것입니다.

find . -name '*cache*' -prune -o -print0 | xargs -0 grep -il "samson" 

또는

find . -name '*cache*' -prune -o -exec grep -iq "samson" {} \; -print 

주, 첫 번째 명령의 -l "파일을 나열 grep을 알려줍니다

당신은 파이프 버전 또는 단일 명령을 사용하여 명령을 업데이트 할 수는

"일치하는 라인이 아닙니다. 두 번째에있는 -q은 똑같습니다. 그것은 grep에 조용히 응답하도록 알려주므로 find은 파일 이름을 인쇄합니다.

+0

고마워요! 재귀 제거는 나를위한 트릭이었습니다. (오래 된 습관은 열심히 죽는다. 필자가 보통 실수로 "-r -i -I"를 사용했기 때문에 실수로 반복되는 재귀 플래그보다 훨씬 의미가있다.) "wholename"부분은 괜찮 았지만, 원하지 않는 서브 디렉토리가 실제로 현재 디렉토리의 루트 레벨이기 때문입니다. 그래서 지금은 : 'find. -wholename './cach*'-prune -o -print | xargs grep -i -I "samson"' – eternalnewb

+0

굉장하고, 기뻤습니다. =] – newfurniturey

3

-exec 옵션을 사용합니다. 거기에서 grep "samson" {} \;을 사용하여 나열된 각 파일에서 samson을 찾을 수 있습니다. 예를 들어

:

find . -wholename './cach*' -prune -o -exec grep "samson" "{}" + 
3

고객님은 grep에 재발 신고를하셨습니다 (두 번! -r-R은 동의어 임). 전달중인 인수 중 하나가 . (최상위 디렉토리)이기 때문에 grep은 모든 파일에서 검색 중입니다 (그 중 일부는 하위 디렉토리에있는 경우 두 번 이상 표시됩니다).

당신이 findgrep를 사용하려고하는 경우, 다음을 수행 -print0-0를 사용

find . -path './cach*' -prune -o -print0 | xargs -0 grep -i "samson" 

도 공백이나 구두점 문자가 포함 된 파일 이름으로 스크립트 작업을합니다.(이것은 또한 ./deeply/nested/directory/cache을 제외 당신 만의 캐시 디렉토리를 제외 할 경우

grep -R --exclude-dir='cach*' -i "samson" . 

:.

그러나, 당신은 아마 GNU의 GREP은 제외 디렉토리 할 수 ​​있기 때문에, 여기 find 귀찮게 할 필요가 없습니다 최상위 디렉토리 인 경우 find을 사용하십시오.)

+0

현재 폴더/경로에 너무 많은 파일이있는 경우, 단일 'grep'은 "너무 많은 인수"오류를 반환합니다. 당신은 그 자체로 조심해야 할 것입니다. – newfurniturey

+0

잡기 주셔서 감사합니다! "받아 들여진"대답에서 언급했듯이, 바로 고정 된 것을 정리하십시오. 너희들은 위대해. – eternalnewb

+0

@newfurniturey 아니요, 명령 줄이 너무 길면 (예 :'grep ... *'로 작성하고 많은 파일이있는 경우) 쉘에서 "인수가 너무 많습니다"오류가 발생합니다. 여기에는 쉘 덩어리가 없으며 명령 행은 정확하게 43 자입니다. – Gilles