В чем разница между
ls /example or ls /example/
против
ls -d /example/*
Почему они дают (почти) одинаковый результат?
В первом случае вы даете ls каталог и просите показать его содержимое.
Во втором случае вы уже предоставляете ls содержимое напрямую (список отдельных файлов и подкаталогов) и просите показать именно эти элементы, но не их дальнейшее содержимое.
Таким образом, они дают тот же результат, потому что они делают почти то же самое, за исключением того, что в первом случае ls сам определяет, какое содержимое нужно показать, а во втором случае вы даете ему заранее определенный список.
У Ls есть два режима: когда передается файл, он показывает только этот файл; когда дан каталог, он показывает содержимое этого каталога (один уровень глубиной).
Ваш /example является каталогом, поэтому при использовании ls /example ls покажет его содержимое. Опция -d отключает это поведение и заставляет ls всегда показывать только данный элемент, независимо от того, файл это или нет.
(Сравните: ls -l /etc и ls -l -d /etc)
Но когда вы используете ls -d /example/* , вы не просите его показать каталог - вы даете ему список отдельных элементов для показа. Подстановочные знаки расширяются вашей оболочкой до запуска команды, поэтому вы действительно запускаете команду ls -d /example/file1 /example/file2 /example/file3 .
Когда аргументом ls является каталог, ls входит в каталог и выводит список содержимого каталога, если он не был вызван с -d . И помните, что расширение имени файла ('file *') выполняется в оболочке перед вызовом ls, поэтому у вас есть:
dir
├── file1
└── subdir
└── file2
ls dir перечисляет содержимое dir (одна строка для file1 , одна для subdir)ls -d dir только перечисляет dir (в одной строке)ls dir/* раскрывается в ls dir/file1 dir/subdir и, таким образом, раскрывает subdir для отображения его содержимогоls -d dir/* расширяется до ls dir/file1 dir/subdir , но из-за того, что -d subdir не раскрывается, отображаются только file1 и subdir (поэтому вы получите тот же вывод, что и в первом случае)