find 테스트와 bash 테스트는 동일한 결과를 제공하지 않습니다. 이유는 무엇입니까?

find 테스트와 bash 테스트는 동일한 결과를 제공하지 않습니다. 이유는 무엇입니까?

내 이전 질문에서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옵션 인수에 (디렉토리 대신) 파일 유형이 있는데도 디렉토리가 제공되는 이유는 무엇입니까 ? ( ls -ld디렉토리 중 하나로 이동하면 링크나 아무것도 없습니다.)

답변1

흠... 두 명령 모두 내 홈 디렉토리에서 동일한 방식으로 작동합니다. 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가 소유한 경우 True"로 간주되지 않는 이유를 자세히 조사하십시오.

답변2

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

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

-executable액세스 권한이 없는 디렉토리의 경우 부정 테스트가 유지되고 -prune해당 디렉토리는 검색 트리에서 제거되어 find유틸리티가 해당 디렉토리에 액세스하지 못하도록 하여 권한 오류 생성을 방지합니다.

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

당신이 그것에 대해 아무 말도 하지 않았기 때문에 결과의 차이에 대해 (아직) 논평할 수 없습니다. 출력 크기가 매우 다양하므로 한 명령이 다른 명령이 찾지 못하는 것을 찾는 경우를 찾아 확인하는 것이 쉽지 않습니다.

관련 정보