В чем разница между этими аргументами командной строки ls: -d vs *

264
Jibin

В чем разница между

ls /example or ls /example/ 

против

ls -d /example/* 

Почему они дают (почти) одинаковый результат?

0

2 ответа на вопрос

2
grawity

В первом случае вы даете 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.

1
xenoid

Когда аргумент to 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перечисляется (так вы получите тот же вывод, что и в первом случае).

Похожие вопросы