В чем разница между
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
(поэтому вы получите тот же вывод, что и в первом случае)