find -exec는 모든 결과를 미리 찾아주나요, 아니면 이전 결과를 실행할 때 추가된 결과를 찾아주나요?

find -exec는 모든 결과를 미리 찾아주나요, 아니면 이전 결과를 실행할 때 추가된 결과를 찾아주나요?

따라서 처음 1000번 다운로드한 후 5초 길이의 오디오 파일 5000개를 다운로드하려면 다음을 실행합니다.

find . -iname "*.wav" -exec play {} \;

명령을 처음 실행했을 때 있던 1000개의 파일만 재생합니까, 아니면 exec가 완료할 수 있는 것보다 파일이 더 빠르게 다운로드되기 때문에 5000개의 파일을 모두 재생합니까?

답변1

이는 구현에 따라 다릅니다.표준이론:

검색 중인 디렉터리 계층 구조에서 파일이 제거되거나 추가되는 경우 여부가 지정되지 않습니다.찾다검색에 파일을 포함합니다.

디렉토리 레이아웃과 파일 시스템 동작에 따라 두 가지 동작이 모두 발생할 수 있다고 생각합니다. find항목을 읽기 위해 디렉토리를 연 후 새로 추가된 항목이 반환되는 경우 readdir에도 find이 문제가 처리됩니다 . 하지만 이것도 명시되어 있지 않다POSIX:

가장 최근 호출 opendir()시 또는 그 이후에 파일이 제거되거나 디렉토리에 추가되는 경우 rewinddir()후속 호출이 해당 파일에 대한 항목을 반환하는지 여부 readdir()는 지정되지 않습니다 .


적어도 macOS에서 GNU 찾기 및 BSD 찾기를 사용할 때 동작은 디렉터리의 모든 항목을 한 번에 읽는 것 같습니다.

% (sleep 5; touch abc) & find . -exec sleep 5 \; -print
[1] 57727
.
[1]  + 57727 done       ( sleep 5; touch abc; )
./foo
./bar

어떻게 찾을 수 없는지 확인하세요 abc. 그러나 첫 번째 것이 sleep감소 하면 find재귀는 다음과 같습니다.. 뒤쪽에끝났어 sleep:

% rm abc; (sleep 2; touch abc) & find . -exec sleep 5 \; -print
[1] 57971
[1]  + 57971 done       ( sleep 2; touch abc; )
.
./abc
./foo
./bar

따라서 파일이 다른 하위 디렉터리에 다운로드되면 find실행 후 다운로드한 파일 중 일부는 재생될 수 있지만 일부는 재생되지 않을 수 있습니다.

관련 정보