find test와 bash test가 동일한 결과를 제공하지 않는 이유는 무엇입니까?

find test와 bash test가 동일한 결과를 제공하지 않는 이유는 무엇입니까?

내 이전 질문에서find -exec에서 현재 파일을 {}로 대체하는 방법은 무엇입니까?, 나는 에 대한 테스트에 대해 질문했습니다 find. 내가 소유하지 않은 모든 파일을 찾고 싶습니다. 따라서 적절한 find 명령이 있습니다.

find . -type f ! -user "$USER"

하지만 이것도 마찬가지여야 합니다:

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

그러나 둘 다 다른 결과를 제공합니다.

1) 그렇게 한다면 [command one] | wc -c--> 4121

하지만: [command two] | wc -c--> 236768 (PS: 내 $HOME에서 파일을 검색하고 있습니다.)

둘 다 찾은 파일 수에 대해 서로 다른 숫자를 제공합니다.

2) 둘 다 여전히 결과 파일을 제공합니다.디렉토리(예, 제가 소유하지 않은 디렉토리이므로 허가가 거부되었습니다.) find . -type f옵션 인수에 유형 파일(dir이 아닌)이 있음에도 불구하고 디렉토리를 제공합니다 . 이유는 무엇입니까? (내가 ls -ld그 디렉토리 중 하나일 때 링크나 다른 어떤 것도 없습니다)

답변1

흠 ... 내 homedir에서는 두 명령이 모두 동일하게 작동합니다. 8-/

그럼에도 불구하고 stderr을 /dev/null로 리디렉션하고 wc -l출력을 올바르게 계산하는 데 사용해야 합니다.

find . -type f ! -user "$USER" 2>/dev/null | wc -l
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + | wc -l

여기에서 결과를 텍스트 파일로 리디렉션하고 파일을 비교하여 차이점을 찾을 수 있습니다.

find . -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt

차이점이 있는 경우 /tmp/file_2.txt의 초과 파일 중 일부를 가져와 해당 파일이 '파일이 존재하고 유효 사용자 ID가 소유한 경우 참'으로 간주되지 않는 이유를 자세히 조사하십시오.

답변2

find실제로 액세스할 수 없는 디렉토리를 입력 하지 않으려면 다음을 사용할 수 있습니다 ! -executable -prune.

find . ! -executable -prune -type f ! -user "$USER"

부정 -executable테스트는 액세스 권한이 없는 디렉토리에 대해 적용되며 의 검색 트리 -prune에서 해당 디렉토리를 제거하여 유틸리티의 액세스 시도를 중지하고 권한 오류 생성을 방지합니다.find

테스트 (유사 및 테스트 -executable포함 )는 비표준이며 GNU 가 필요합니다 .-readable-writablefind

귀하가 이에 대해 아무 말도 하지 않았기 때문에 결과의 차이에 대해 (아직) 아무 말도 할 수 없습니다. 출력 크기가 매우 다양하기 때문에 한 명령이 다른 명령이 찾지 못한 것을 발견한 경우를 찾아 조사하는 것은 쉽지 않습니다.

관련 정보