나는 역사적으로 다음과 같은 일을 해왔습니다.
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.1xargs --version
:GNU xargs 버전 4.2.27- STDERR 리디렉션을 제거해도 결과에는 영향이 없거나 전혀 영향을 미치지 않습니다.
- (작동하는 것으로 알려짐)에는
barfoo
공백이 없지만 다른 디렉터리의 파일에는/foo/bar
공백이 있을 수 있습니다. 그러나 이에 대한 문제가 무엇인지 알 수 없습니다. - 경로를 지정하지 않았다는 것을 알고 있지만 이는 이름이 잘 지정된 디렉터리이므로 다른 장치와 혼동하지 마세요.
흥미로운 결과:
첫 번째는 작동하지 않지만 두 번째는 작동합니다.
find . -type f | xargs grep -i something_to_find
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에 문제가 있는 것입니다.
나는 의도적으로 이러한 오류를 제거하지 않습니다. 유용할 수 있습니다.