
Я пытаюсь понять, как работает ls -d. Я прочитал другие вопросы по ls -d, но ни в одном из них не спрашивается, почему ls -d *
не работает так же, как ls -d */
. Почему символ-разделитель в конце так важен?
ls *
и ls */
вели себя так же, поэтому я ожидал, ls -d *
что и ls -d */
работать будут так же.
Вместо этого,
ls -d *
перечисляет все файлы в текущем каталоге, как и делает ls
, тогда как ls -d */
перечисляет каталог в текущем каталоге. Почему это так?
решение1
ls *
иls */
вести себя так же.
Нет, не делают. Если у вас есть файлы в рабочем каталоге, они будут перечислены первой командой, но не второй.
ls
выведет список файлов и каталогов (включая их содержимое), переданных в командной строке. Если вы используете подстановку оболочки, ваша оболочка заменитузоры«с отсортированным в алфавитном порядке списком имен файлов» (ср.Расширение имени файла).
Шаблон *
будет соответствовать каждому файлу и каталогу в текущем каталоге (за исключением скрытых файлов, начинающихся с .
), при этом */
будут соответствовать только каталогам (за исключением скрытых каталогов).
Переключатель -d
отключает вывод списка содержимого каталогов, но файлы, переданные в ls, по-прежнему будут выводиться в списке.
решение2
Ответ таков: окончание /
заставляет ls просматривать только каталоги.
Обратите внимание, что поведение одинаково (и с, и без -d
).
Небольшой тест:
mkdir /tmp/test
touch /tmp/test/a
mkdir /tmp/test/b
touch /tmp/test/b/c
cd /tmp/test
А затем сделайте ls *
это, ls */
и вы заметите разницу.