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

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

/usr/myDir / и /home/myDir/

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

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

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

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 найдет то, что основной системный вызов для файловой системы возвращается первым.

  • Как обратное совпадение строки на языке программирования Vim?
  • команда find возвращает текущий рабочий каталог как первый вывод
  • Быстрый инкрементный поиск файлов из оболочки
  • Поиск функций, команд и встроенных функций
  • Искать значение только в одном столбце wo с помощью awk, sed или perl
  • Grep строка из того же файла в нескольких файлах .tar.gz
  • Поиск по размеру файла
  • Как удалить / изменить результаты поиска в меню запуска Linux Mint?
  • Заменить очень длинную строку в файлах рекурсивно
  • Выберите добавленные строки из файла
  • Найти путь, который имеет конкретную подкаталоги
  • Найти с помощью mkdir и подстроки
  • Interesting Posts

    перенаправление не выполняется

    Как просматривать и воспроизводить файлы .mov на Ubuntu 16.04 LTS

    Как вызвать файл сценария оболочки с переменным аргументом через python

    Linux: создание сетевого моста снижает скорость сетевого адаптера до 100 Мбайт / с вместо 1000 МБ / с

    apt-get ошибка установки программного обеспечения на Parrot OS

    Создание файла fasta из 2 разных файлов

    Перед обновлением пакета, как я могу узнать, какие файлы будут изменены?

    Попробуйте запустить одну программу в Debian

    Как получить детерминированный полный сброс всех правил iptables?

    Samba: ошибка монтирования: не удалось разрешить адрес для XXX: неизвестная ошибка

    Как прочитать вывод команд в скрипте

    Статус Git-Branch

    Как распаковывать файлы из архива, игнорируя имена файлов?

    Как разбить несколько столбцов на два столбца на основе первого столбца

    Сценарий оболочки для записи выбранных полей в одну строку

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