내 이전 질문에서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
-writable
find
귀하가 이에 대해 아무 말도 하지 않았기 때문에 결과의 차이에 대해 (아직) 아무 말도 할 수 없습니다. 출력 크기가 매우 다양하기 때문에 한 명령이 다른 명령이 찾지 못한 것을 발견한 경우를 찾아 조사하는 것은 쉽지 않습니다.