Где первая команда поиска выглядит, если есть каталоги с тем же именем?

Предположим, у меня есть два разных каталога с одинаковыми именами папок:

/usr/myDir / и /home/myDir/

Если я запустил команду, например:

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

он переходит в /usr/myDir . Почему это? Где первая команда поиска выглядит, когда речь идет о специальных экземплярах вроде этого?

  • Vim: поиск вверх / вниз в файле из определенной точки / позиции
  • Что означает эта линия Баша?
  • Игнорирование файлов, которые не могут найти или открыть файл cannnot?
  • Заменить очень длинную строку в файлах рекурсивно
  • Как скопировать содержимое файлов из поиска в командной строке в один файл?
  • Найдите конкретную вложенность имен каталогов, например ... / project / dir1 / dir2
  • Выберите добавленные строки из файла
  • Ожидаемое поведение `find -depth`, если разрешение на выполнение запрещено для подкаталога?
  • 2 Solutions collect form web for “Где первая команда поиска выглядит, если есть каталоги с тем же именем?”

    find файлы траверс в любом порядке, возвращаемом файловой системой. Этот порядок не предсказуем; создание, удаление или переименование файла может изменить порядок других файлов в том же каталоге.

    Это find / -type d -name myDir , что find / -type d -name myDir возвращает /usr/myDir или /home/myDir , и это может измениться в любое время. (В этом конкретном примере он, вероятно, не будет меняться часто, потому что редко можно писать в корневой каталог, но в целом не рассчитывайте на него.)

    В некоторых оболочках (включая bash) команда cd игнорирует все, кроме своих первых аргументов, поэтому ваша команда молча изменяет рабочий каталог на то, что сначала возвращает. (Ваша команда также не будет работать для пути, содержащего пробелы .) В других оболочках (таких как ksh и zsh) вы получите сообщение об ошибке.

    Есть два вопроса; как 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 перед /some или / , Таким образом, вы getdents(2) с тем, что возвращает системный вызов, getdents(2) из быстрого find в Linux. Эти записи не должны считаться отсортированными в определенном порядке (если только что-то вроде 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 найдет то, что основной системный вызов для файловой системы возвращается первым.

    Linux и Unix - лучшая ОС в мире.