Сортировка с символами Glob
8.2.5 Listing with globbing
Команда lsобычно используется для вывода списка файлов в каталоге; в результате использование echoкоманды может показаться странным выбором. Однако в этой команде есть что-то ls, что вызывает проблемы при выводе списка файлов с использованием шаблонов глобусов.
Имейте в виду, что это оболочка, а не команда echoили ls, расширяет шаблон глобуса в соответствующие имена файлов. Другими словами, если echo /etc/a*команда выполняется, оболочка перед выполнением команды echo заменяет a*все файлы и каталоги в /etcкаталоге, которые соответствуют шаблону.
Итак, если ls /etc/a*команда запущена, оболочка действительно запустит следующее:
ls /etc/adduser.conf /etc/alternatives /etc/apparmor /etc/apparmor.d /etc/aptКогда lsкоманда видит несколько аргументов, она выполняет операцию списка для каждого элемента отдельно. Другими словами, ls /etc/a*это то же самое, что и последовательное выполнение следующих команд:
ls /etc/adduser.conf
ls /etc/alternatives
ls /etc/apparmor
ls /etc/apparmor.d
ls /etc/aptТеперь рассмотрим, что произойдет, если lsкоманде будет передан файл, например /etc/adduser.conf:
sysadmin@localhost : ~ $ ls /etc/adduser.conf
/etc/adduser.confВыполнение lsкоманды для одного файла приводит к печати имени файла; обычно это полезно, если -lпараметр используется для просмотра сведений о конкретном файле:
sysadmin@localhost : ~ $ ls -l /etc/adduser.conf
-rw-r--r-- 1 root root 3028 26 may 2018 г. /etc/adduser.confОднако что, если lsкоманде в качестве аргумента задано имя каталога? В этом случае вывод команды отличается от того, если бы аргумент был обычным файлом:
sysadmin@localhost : ~ $ ls /etc/apparmor
init parser.conf subdomain.conf Если lsкоманде задано имя каталога, команда отображает содержимое каталога (имена файлов в каталоге), а не только имя каталога. Имена файлов в предыдущем примере — это имена файлов в /etc/apparmorкаталоге.
Почему это проблема при использовании globs? Рассмотрим следующий вывод:
Когда lsкоманда видит имя файла в качестве аргумента, она просто отображает имя файла. Однако для любого каталога отображается содержимое каталога, а не только имя каталога.
Это становится еще более запутанным в ситуации, подобной следующей:
В предыдущем примере кажется, что lsкоманда просто неверна. Однако на самом деле произошло то, что единственное, что соответствует глобусу, /etc/x*— это /etc/xdgкаталог.
Итак, lsкоманда отображала только файлы в этом каталоге!
У этой проблемы есть простое решение: всегда используйте -dопцию с globs, которая указывает lsкоманде отображать имя каталогов вместо их содержимого:
Last updated