如果存在同名目录,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对于这个 shell,将转到找到的第一个项目。其次,find它本身可能会或可能不会对结果进行任何排序,并且对于目录(可能)只有一个-d或“按深度查找第一个”选项,该选项将/some/deeper/dir/some或之前返回/。因此,您将得到 Linux上系统调用返回的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,而且随时可能发生变化。 (在这个特定的示例中,它可能不会经常更改,因为很少写入根目录,但通常不要指望它。)

在某些 shell(包括 bash)中,该cd命令会忽略除第一个参数之外的所有参数,因此您的命令会默默地将工作目录更改为find首先返回的目录。 (你的命令也不适用于包含空格的路径.)在其他 shell(例如 ksh 和 zsh)中,您会收到错误消息。

相关内容