Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Фундаментальные основы Linux. Часть IV. Программные каналы и команды

Оригинал: Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 16 декабря 2014 г.

Глава 18. Стандартные инструменты систем Unix

В данной главе описаны утилиты, предназначенные для поиска файлов или установления путей к файлам, сжатия файлов, а также другие стандартные инструменты, которые не обсуждались ранее. Несмотря на то, что рассматриваемые инструменты технически не являются фильтрами, они могут использоваться в рамках конвейеров.

Утилита find

Утилита find может выполнять полезную работу в начале конвейера в случае возникновения необходимости в поиске фалов. Ниже представлено несколько примеров ее использования. Вы также можете рассмотреть возможность добавления конструкции для перенаправления стандартного потока ошибок 2>/dev/null в строки команд для того, чтобы ваш экран не заполнялся сообщениями об ошибках.

Команда для поиска всех файлов в директории /etc и сохранения списка имен найденных файлов в файле etcfiles.txt:
find /etc > etcfiles.txt
Команда для поиска файлов во всей файловой системе и сохранения списка имен найденных файлов в файле allfiles.txt:
find / > allfiles.txt
Команда для поиска файлов с расширением .conf в текущей директории (и всех поддиректориях):
find . -name "*.conf"
Команда для поиска обычных файлов с расширением .conf и явным указанием типа этих файлов (без директорий, именованных каналов и других файлов специальных типов):
find . -type f -name "*.conf"
Команда для поиска файлов специального типа, представляющих директории, с расширением .bak:
find /data -type d -name "*.bak"
Команда для поиска файлов, созданных позднее файла file42.txt:
find . -newer file42.txt
Утилита find также может исполнять произвольные команды для обработки каждого из найденных файлов. В данном примере мы осуществляем поиск файлов с расширением *.odf и копируем их в директорию /backup/.
find /data -name "*.odf" -exec cp {} /backup/ \;
Кроме того, утилита find может запрашивать подтверждение перед исполнением заданной команды для обработки каждого из найденных файлов. В данном примере файлы с расширением *.odf будут удаляться в том случае, если вы подтвердите необходимость исполнения этой операции для каждого из найденных файлов.
find /data -name "*.odf" -ok rm {} \;

Утилита locate

Утилита locate имеет значительное отличие от утилиты find, заключающееся в том, что она использует данные индексирования файловой системы для установления путей к файлам. Несмотря на то, что данный алгоритм поиска гораздо быстрее алгоритма с обходом всех директорий файловой системы, в случае его использования данные о файловой системе в подавляющем большинстве случаев являются устаревшими. В том случае, если данные индексирования файловой системы еще не собраны, вам придется осуществить их сбор путем выполнения команды updatedb (в дистрибутиве Red Hat Enterprise Linux для выполнения описанной операции понадобятся привилегии пользователя root).
[paul@RHEL4b ~]$ locate Samba
locate: не удалось выполнить stat () "/var/lib/mlocate/mlocate.db": Нет такого файла или каталога
[paul@RHEL4b ~]$ updatedb 
updatedb: не удалось открыть временный файл для "/var/lib/mlocate/mlocate.db"
[paul@RHEL4b ~]$ su -
Password: 
[root@RHEL4b ~]# updatedb
[root@RHEL4b ~]#

В большинстве дистрибутивов Linux для исполнения команды updatedb один раз в день используется планировщик задач.

Утилита date

Утилита date может использоваться для вывода информации о дате, времени, часовом поясе, а также дополнительной информации.
paul@rhel55 ~$ date
Sat Apr 17 12:44:30 CEST 2010
Форматирование строки с информацией о дате может быть изменено в соответствии с вашими предпочтениями. Обратитесь к странице руководства для получения информации о других параметрах форматирования.
paul@rhel55 ~$ date +'%A %d-%m-%Y'
Суббота 17-04-2010
Во всех системах Unix для подсчета времени используется количество секунд, прошедших с 1969 года (первой секундой является первая секунда первого дня января 1970 года). Для вывода времени Unix в секундах может использоваться команда date +%s.
paul@rhel55 ~$ date +%s
1271501080
Когда же значение этого счетчика достигнет двух миллиардов секунд?
paul@rhel55 ~$ date -d '1970-01-01 + 2000000000 seconds'
Ср май 18 03:33:20 MSK 2033

Утилита cal

Утилита cal выводит календарь для текущего месяца, в котором выделен текущий день.
     Апрель 2010     
Пн Вт Ср Чт Пт Сб Вс
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
Вы можете выбрать любой месяц из прошлого или будущего.
paul@rhel55 ~$ cal 2 1970
   Февраль 1970    
Пн Вт Ср Чт Пт Сб Вс
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

Утилита sleep

Утилита sleep иногда используется в сценариях для перехода в режим ожидания на заданный промежуток времени в секундах. В данном примере показана методика реализации пятисекундного периода ожидания с использованием утилиты sleep.
paul@rhel55 ~$ sleep 5
paul@rhel55 ~$

Команда time

Команда time выводит информацию о том, сколько времени тратится на исполнение заданной команды. На исполнение команды date тратится совсем немного времени.
paul@rhel55 ~$ time date
Суб Апр 17 13:08:27 CEST 2010

real    0m0.014s
user    0m0.008s
sys     0m0.006s
Команда sleep 5 исполняется в течение пяти секунд реального времени, но при этом на ее исполнение тратится совсем немного процессорного времени.
paul@rhel55 ~$ time sleep 5

real    0m5.018s
user    0m0.005s
sys     0m0.011s
А на исполнение команды bzip2, осуществляющей сжатие файла, тратится достаточно много процессорного времени.
paul@rhel55 ~$ time bzip2 text.txt 

real    0m2.368s
user    0m0.847s
sys     0m0.539s

Утилиты gzip - gunzip

Пользователям всегда недостаточно дискового пространства, поэтому инструменты для сжатия данных всегда актуальны. Утилита gzip позволяет осуществить преобразования файлов, после которых они будут занимать меньше дискового пространства.
paul@rhel55 ~$ ls -lh text.txt 
-rw-rw-r-- 1 paul paul 6.4M апр 17 13:11 text.txt
paul@rhel55 ~$ gzip text.txt 
paul@rhel55 ~$ ls -lh text.txt.gz 
-rw-rw-r-- 1 paul paul 760K апр 17 13:11 text.txt.gz
Вы можете получить оригинал вашего файла, воспользовавшись утилитой gunzip.
paul@rhel55 ~$ gunzip text.txt.gz 
paul@rhel55 ~$ ls -lh text.txt
-rw-rw-r-- 1 paul paul 6.4M апр 17 13:11 text.txt

Утилиты zcat - zmore

Содержимое текстовых файлов, сжатых с помощью утилиты gzip, может быть просмотрено с помощью утилит zcat и zmore.
paul@rhel55 ~$ head -4 text.txt 
/
/opt
/opt/VBoxGuestAdditions-3.1.6
/opt/VBoxGuestAdditions-3.1.6/routines.sh
paul@rhel55 ~$ gzip text.txt 
paul@rhel55 ~$ zcat text.txt.gz | head -4
/
/opt
/opt/VBoxGuestAdditions-3.1.6
/opt/VBoxGuestAdditions-3.1.6/routines.sh

Утилиты bzip2 - bunzip2

Файлы также могут сжиматься с помощью утилиты bzip2, которая, несмотря на немного большие по сравнению с утилитой gzip затраты времени, позволяет достичь лучших показателей сжатия данных.
paul@rhel55 ~$ bzip2 text.txt 
paul@rhel55 ~$ ls -lh text.txt.bz2 
-rw-rw-r-- 1 paul paul 569K апр 17 13:11 text.txt.bz2
Декомпрессия результирующих файлов может быть осуществлена с помощью утилиты bzip2.
paul@rhel55 ~$ bunzip2 text.txt.bz2 
paul@rhel55 ~$ ls -lh text.txt 
-rw-rw-r-- 1 paul paul 6.4M аpr 17 13:11 text.txt

Утилиты bzcat - bzmore

И, аналогичным образом, с помощью утилит bzcat и bzmore может осуществляться вывод содержимого файлов, сжатых с использованием утилиты bzip2.
paul@rhel55 ~$ bzip2 text.txt 
paul@rhel55 ~$ bzcat text.txt.bz2 | head -4
/
/opt
/opt/VBoxGuestAdditions-3.1.6
/opt/VBoxGuestAdditions-3.1.6/routines.sh

Практическое задание: стандартные инструменты систем Unix

1. Дайте пояснения относительно различий между следующими двумя командами. Этот вопрос является очень важным. Если вы не знаете ответа на него, вам следует снова обратиться к главе, посвященной работе с командной оболочкой.
find /data -name "*.txt"
find /data -name *.txt
2. Дайте пояснения относительно различий между следующими двумя командами. Будут ли обе команды работоспособны в том случае, если в директории /data будут находиться 200 файлов с расширением .odf? А что будет в том случае, если в этой директории будут находится два миллиона файлов с расширением .odf?
find /data -name "*.odf" > data_odf.txt
find /data/*.odf > data_odf.txt

3. Создайте команду на основе утилиты find, которая будет осуществлять поиск всех файлов, созданных после 30 января 2010 года.

4. Создайте команду на основе утилиты find, которая будет осуществлять поиск всех файлов с расширением .odf, созданных в сентябре 2009 года.

5. Подсчитайте количество файлов с расширением *.conf в директории /etc и всех поддиректориях.

6. Ниже приведены две команды, выполняющие одну и ту же операцию: копирование файлов с расширением *.odf в директорию /backup/. По какой причине первая команда может быть заменена на вторую? И снова данный вопрос является очень важным.
cp -r /data/*.odf /backup/
find /data -name "*.odf" -exec cp {} /backup/ \;

7. Создайте файл с именем loctest.txt. Можете ли вы установить путь к данному файлу с помощью утилиты locate? Почему это невозможно? Что нужно сделать для того, чтобы утилита locate возвращала путь к данному файлу.

8. Используйте утилиту find с параметром -exec для обработки всех файлов с расширением .htm, заключающейся в смене расширения на .html.

9. Выполните команду date. После этого выведите информацию о текущей дате в формате YYYY/MM/DD.

10. Выполните команду cal. Выведите календарь для 1582 и 1752 годов. Заметили ли вы что-нибудь особенное?

Корректная процедура выполнения практического задания: стандартные инструменты систем Unix

1. Дайте пояснения относительно различий между следующими двумя командами. Этот вопрос является очень важным. Если вы не знаете ответа на него, вам следует снова обратиться к главе, посвященной работе с командной оболочкой.
find /data -name "*.txt"
find /data -name *.txt

В том случае, если описание расширения файлов *.txt находится в двойных кавычках, командная оболочка не будет преобразовывать его. Инструмент find будет осуществлять поиск файлов с именами, оканчивающимися на .txt в директории /data.

Если же описание расширения файлов *.txt используется без двойных кавычек, командная оболочка осуществит его раскрытие (разумеется, в том случае, если в директории расположен один или несколько файлов с расширением .txt). В этом случае утилита find может вывести отличный результат или сообщение о синтаксической ошибке.

2. Дайте пояснения относительно различий между следующими двумя командами. Будут ли обе команды работоспособны в том случае, если в директории /data будут находиться 200 файлов с расширением .odf? А что будет в том случае, если в этой директории будут находится два миллиона файлов с расширением .odf?
find /data -name "*.odf" > data_odf.txt
find /data/*.odf > data_odf.txt

В результате исполнения первой команды будет выведен список имен всех файлов с расширением .odf из директории /data и всех поддиректорий. Командная оболочка перенаправит вывод команды в файл с заданным именем.

Вторая команда выведет список, состоящий из имен всех файлов с расширением .odf из директории /data, а также имен всех файлов из поддиректорий с именами *.odf (директории /data).

При работе с директорией с двумя миллионами файлов в результате раскрытия команды будет превышено допустимое для командной оболочки количество символов. Таким образом, конец строки результирующей команды будет потерян.

3. Создайте команду на основе утилиты find, которая будет осуществлять поиск всех файлов, созданных после 30 января 2010 года.

touch -t 201001302359 marker_date
find . -type f -newer marker_date
Существует и другое решение:
find . -type f -newerat "20100130 23:59:59"

4. Создайте команду на основе утилиты find, которая будет осуществлять поиск всех файлов с расширением .odf, созданных в сентябре 2009 года.

touch -t 200908312359 marker_start
touch -t 200910010000 marker_end
find . -type f -name "*.odf" -newer marker_start ! -newer marker_end

Символ восклицательного знака ! перед параметром -newer может рассматриваться как логический оператор "НЕ".

5. Подсчитайте количество файлов с расширением *.conf в директории /etc и всех поддиректориях.

find /etc -type f -name '*.conf' | wc -l
6. Ниже приведены две команды, выполняющие одну и ту же операцию: копирование файлов с расширением *.odf в директорию /backup/. По какой причине первая команда может быть заменена на вторую? И снова данный вопрос является очень важным.
cp -r /data/*.odf /backup/
find /data -name "*.odf" -exec cp {} /backup/ \;

Исполнение первой команды может завершиться неудачей в том случае, если в директории находится настолько много файлов, что их имена не уместятся в одну строку команды максимального размера.

7. Создайте файл с именем loctest.txt. Можете ли вы установить путь к данному файлу с помощью утилиты locate? Почему это невозможно? Что нужно сделать для того, чтобы утилита locate возвращала путь к данному файлу.

Вы не можете установить путь к файлу с помощью утилиты locate, так как файл не был проиндексирован. Индексация должна осуществляться с помощью команды:
updatedb

8. Используйте утилиту find с параметром -exec для обработки всех файлов с расширением .htm, заключающейся в смене расширения на .html.

paul@rhel55 ~$ find . -name '*.htm'
./one.htm
./two.htm
paul@rhel55 ~$ find . -name '*.htm' -exec mv {} {}l \;
paul@rhel55 ~$ find . -name '*.htm*'
./one.html
./two.html

9. Выполните команду date. После этого выведите информацию о текущей дате в формате YYYY/MM/DD.

date +%Y/%m/%d

10. Выполните команду cal. Выведите календарь для 1582 и 1752 годов. Заметили ли вы что-нибудь особенное?

cal 1582

Календари отличаются в зависимости от стран, выбранных пользователями при настройке системы. Обратитесь к документу, расположенному по адресу: http://linux-training.be/files/studentfiles/dates.txt.


Предыдущий раздел: Оглавление Следующий раздел:
Глава 17. Фильтры   Глава 19. Регулярные выражения