Сортировка с символами 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