Linux: find | xargs grep에 제한이 있습니까?

Linux: find | xargs grep에 제한이 있습니까?

나는 역사적으로 다음과 같은 일을 해왔습니다.

find . 2>/dev/null | xargs grep -i something_to_find 2>/dev/null

pwd것이 barfoo( /foo/bar/baz/foofoo/foobar/foobaz/barfoo)라면 일치하는 항목을 찾을 것입니다. 그러나 cd이렇게 하면 /foo더 이상 일치하는 항목을 찾을 수 없습니다.


상황:

  • 권한은 모두 775입니다.
  • 디렉토리는 심볼릭 링크가 아닙니다
  • 모두 동일한 파일 시스템/서버에 있습니다.

-maxdepth조회에 작동하는 기본값이 있는지, 아니면 이것이 작동하지 않게 만드는 다른 제한 사항이 있는지 궁금합니다 .


추가 정보:

훌륭한 댓글이 게시되었습니다. 다음은 몇 가지 추가 정보입니다.

  • 이는 POSIX가 아닌 GNU용입니다.
  • find --version:GNU 버전 4.2.27 찾기
  • grep --version: (GNU grep) 2.5.1
  • xargs --version:GNU xargs 버전 4.2.27
  • STDERR 리디렉션을 제거해도 결과에는 영향이 없거나 전혀 영향을 미치지 않습니다.
  • (작동하는 것으로 알려짐)에는 barfoo공백이 없지만 다른 디렉터리의 파일에는 /foo/bar공백이 있을 수 있습니다. 그러나 이에 대한 문제가 무엇인지 알 수 없습니다.
  • 경로를 지정하지 않았다는 것을 알고 있지만 이는 이름이 잘 지정된 디렉터리이므로 다른 장치와 혼동하지 마세요.

흥미로운 결과:

첫 번째는 작동하지 않지만 두 번째는 작동합니다.

  1. find . -type f | xargs grep -i something_to_find
  2. find . -type f -name "*.ext" | xargs grep -i something_to_find

더 이상한 점은 이것이 -name "*.*"작동하지 않는다는 것입니다. 파일 확장자를 지정해야 하며 이로 인해 무언가를 검색할 때 문제가 발생할 수 있습니다.

최대 오류 횟수 또는 최대 버퍼 크기 후에 종료되는지 알고 싶습니다. 이 디렉터리에 많은 파일이 있다는 것을 알고 있지만 파일 형식을 지정할 때(결과 제한) 작동한다는 사실은 흥미롭습니다.

답변1

이름에 공백이 있는 디렉토리( visible /foo/bar및 not visible barfoo)가 원인일 가능성이 높습니다. xargs출력을 공백으로 분할하고 따옴표, 백슬래시 및 심지어 해석합니다 _.수동자세한 내용은 파일 또는 디렉터리 이름에 공백이 있으면 불완전한 파일 이름이 grep.

이 문제를 해결하려면 find -print0다음과 함께 사용하십시오 xargs -0.

find . -print0 2>/dev/null | xargs -0 grep -i something_to_find 2>/dev/null

-print0옵션은 find파일 이름이 유효한 파일 이름에 나타날 수 없는 이진수 0 문자로 구분됨을 나타냅니다. 해당 -0옵션은 섹션에 동일한 문자를 구분 기호로 사용하고 따옴표와 백슬래시를 해석하지 않도록 지시합니다.

답변2

최근 편집 내용을 고려하여 위의 내 의견을 다시 알려드리고 싶습니다.

"동일 서버"를 언급하셨으니 /proc/kcore 또는 /dev/zero와 같은 특수 파일이 경로 어디에나 존재할 수 있습니까? 이것은 grep이 더 이상 진행되는 것을 확실히 막을 것입니다 ...

확장을 추가하면 이러한 규칙 공간 없이 다른 결과가 생성되므로 이것이 범인이 됩니다.

답변3

노력하다

grep -r something_to_find 2>/dev/null

"grep -r ..."은 $PWD의 모든 파일을 재귀적으로 검색합니다.

답변4

이 시도:

find . -type f -print0 | tee /tmp/file-list | xargs -0 egrep whatever

/tmp/file-list(null을 신경 쓰지 않는 항목으로 보기)에 원하는 파일이 포함되어 있습니까? 그렇지 않다면 검색 문제입니다. 그렇다면 xargs에 문제가 있는 것입니다.

나는 의도적으로 이러한 오류를 제거하지 않습니다. 유용할 수 있습니다.

관련 정보