![동일한 이름의 디렉토리가 존재하는 경우 find 명령은 어디를 먼저 찾습니까?](https://linux55.com/image/82822/%EB%8F%99%EC%9D%BC%ED%95%9C%20%EC%9D%B4%EB%A6%84%EC%9D%98%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EA%B0%80%20%EC%A1%B4%EC%9E%AC%ED%95%98%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20find%20%EB%AA%85%EB%A0%B9%EC%9D%80%20%EC%96%B4%EB%94%94%EB%A5%BC%20%EB%A8%BC%EC%A0%80%20%EC%B0%BE%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
동일한 폴더 이름을 가진 두 개의 다른 디렉터리가 있다고 가정해 보겠습니다.
/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)
strace
find
ls
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)에서는 오류 메시지가 표시됩니다.