Настройка и работа в Linux
adb5321d

Использование совместно с другими командами


Сам по себе locate не выполняет ничего кроме вывода имен нужных файлов. Однако вы не всегда можете удовлетворится лишь созерцанием имен и месторасположения найденных файлов. Здесь вам на помощь приходят любимые трубопроводы, конвейеры и прочие радости командной строки.

К примеру хотим получить кроме самих файлов еще и информацию о атрибутах этих файлов. В данном случае нам на помощь приходит подстановка команд:

$ locate crontab /usr/man/man1/crontab.1.gz /usr/man/man5/anacrontab.5.gz /usr/man/man5/crontab.5.gz /usr/bin/crontab /etc/anacrontab /etc/crontab $ ls -ld `!!` ls -ld `locate crontab` -rw-r--r-- 1 root root 370 Mar 3 2000 /etc/anacrontab -rw-r--r-- 1 root root 255 Aug 27 1999 /etc/crontab -rwsr-xr-x 1 root root 21816 Feb 3 2000 /usr/bin/crontab -rw-r--r-- 1 root root 1584 Feb 3 2000 /usr/man/man1/crontab.1.gz -rw-r--r-- 1 root root 669 Mar 3 2000 /usr/man/man5/anacrontab.5.gz -rw-r--r-- 1 root root 3495 Feb 3 2000 /usr/man/man5/crontab.5.gz $

В данном примере первой командой мы получили список интересующих нас файлов, а второй передали этот список команде ls -ld, в результате чего получили чудный список с требуемой информацией. Кто забыл чего делает `!!` читать тут Работаем с историей команд. Параметр -d сообщает ls что вместо содержимого каталогов, выводить их атрибуты.

Способ с подстановкой подходит в том случае если у нас не много файлов. В противном случае мы можем столкнутся с ограничением на длину строки параметров передаваемых ls -l. К примеру:

$ locate / | wc -l # <--- locate - выводит все файлы в системе # wc - подсчитывает их количество 70968 $ ls -ld `locate /` | wc -l bash: /bin/ls: Argument list too long 0 $

Как видим вариант не прошел. Поэтому если ожидается большое количество файлов на выходе, более предпочтительнее будет воспользоваться утилитой xargs которая просто читает свой входной поток, разбивает его на строки, а потом эти строки небольшими порциями скармливает программе переданной ей в качестве параметра. Чтобы было более понятно приведу простой пример в котором видно что делает xargs:


$ ls /usr/ X11R6 etc info man bin games kerberos sbin cvsroot i386-redhat-linux lib share dict i486-linux-libc5 libexec src doc include local tmp

$ ls /usr/ | xargs -n 5 echo X11R6 bin cvsroot dict doc etc games i386-redhat-linux i486-linux-libc5 include info kerberos lib libexec local man sbin share src tmp $

Здесь результат выполнения ls /usr/ направляется на вход xargs -n 5, который разбивает полученные строки по пять штук и передает их в качестве аргумента команде echo, как нетрудно догадаться число параметров задается с помощью параметра -n.

В нашем случае указывать количество параметров не требуется, так как оно в данном случае несущественно, главное чтобы ограничение на размер аргумента не было превышено, а эту задачу xargs решает без посторонней помощи:

$ locate / | xargs ls -ld | wc -l 70968 $

Как видим такой вариант в отличие от предыдущего сработал.


Содержание раздела