Сортировка с символами 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? Рассмотрим следующий вывод:
sysadmin@localhost:~$ ls /etc/ap*
/etc/apparmor:
init parser.conf subdomain.conf
/etc/apparmor.d:
abstractions disable local tunables usr.sbin.named
cache force-complain sbin.dhclient usr.bin.man usr.sbin.rsyslogd
/etc/apt:
apt.conf.d preferences.d sources.list sources.list.d trusted.gpg.d
Когда ls
команда видит имя файла в качестве аргумента, она просто отображает имя файла. Однако для любого каталога отображается содержимое каталога, а не только имя каталога.
Это становится еще более запутанным в ситуации, подобной следующей:
sysadmin@localhost : ~ $ ls /etc/x*
autostart systemd user-dirs.conf user-dirs.defaults
В предыдущем примере кажется, что ls
команда просто неверна. Однако на самом деле произошло то, что единственное, что соответствует глобусу, /etc/x*
— это /etc/xdg
каталог.
Итак, ls
команда отображала только файлы в этом каталоге!
У этой проблемы есть простое решение: всегда используйте -d
опцию с globs, которая указывает ls
команде отображать имя каталогов вместо их содержимого:
sysadmin@localhost : ~ $ ls -d /etc/x*
/etc/xdg
Last updated