동일한 이름의 디렉토리가 존재하는 경우 find 명령은 어디를 먼저 찾습니까?

동일한 이름의 디렉토리가 존재하는 경우 find 명령은 어디를 먼저 찾습니까?

동일한 폴더 이름을 가진 두 개의 다른 디렉터리가 있다고 가정해 보겠습니다.

/usr/myDir/ 그리고/home/myDir/

다음 명령을 실행하면:

cd $(find / -type d -name myDir)

로 이동합니다 /usr/myDir. 왜 이런가요? 이와 같은 특별한 상황에 직면했을 때 find 명령은 어디를 먼저 보나요?

답변1

cd다음과 같이 쉽게 테스트할 수 있는 두 가지 질문이 있습니다 .

bash-4.1$ mkdir first second
bash-4.1$ cd first second
bash-4.1$ pwd
/home/jdoe/first
bash-4.1$ 

따라서 cd이 쉘의 경우 발견된 첫 번째 항목이 사용됩니다. 둘째, find결과 자체의 정렬을 수행할 수도 있고 수행하지 않을 수도 있으며, 디렉토리의 경우 (아마도) -d"깊이별로 먼저 찾기" 옵션만 있을 수 있으며 이는 또는 /some/deeper/dir이전에 반환됩니다 . 따라서 Linux의 시스템 호출이 반환하는 내용을 얻게 됩니다 . 이러한 항목은 특정 순서로 되어 있다고 가정하면 안 됩니다(이와 같은 항목이 자동으로 정렬되지 않는 한)./some/getdents(2)stracefindls

bash-4.1$ mkdir c ; sleep 5
bash-4.1$ mkdir b ; sleep 5
bash-4.1$ mkdir a ; sleep 5
bash-4.1$ find .
.
./b
./c
./a

의심스러운 경우 결과를 정렬해야 합니다. 기본적으로 find파일 시스템의 기본 시스템 호출에서 반환된 내용이 먼저 검색됩니다.

답변2

find파일 시스템에서 반환한 순서대로 파일을 탐색합니다. 이 순서는 예측할 수 없습니다. 파일을 생성하거나 삭제하거나 이름을 바꾸면 동일한 디렉터리에 있는 다른 파일의 순서가 변경될 수 있습니다.

find / -type d -name myDir돌아올지 /usr/myDir시작할지 어려운 결정 /home/myDir이고 언제든지 바뀔 수 있습니다. (이 특정 예에서는 루트 디렉터리에 거의 기록되지 않으므로 자주 변경되지는 않지만 일반적으로 이에 의존하지는 않습니다.)

일부 쉘(bash 포함)에서 cd명령은 첫 번째 인수를 제외한 모든 인수를 무시하므로 명령은 자동으로 작업 디렉터리를 find먼저 반환된 디렉터리로 변경합니다. (귀하의 명령도공백이 포함된 경로에서는 작동하지 않습니다..) 다른 셸(예: ksh 및 zsh)에서는 오류 메시지가 표시됩니다.

관련 정보