Библиотека сайта 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
find / > allfiles.txt
find . -name "*.conf"
find . -type f -name "*.conf"
find /data -type d -name "*.bak"
find . -newer file42.txt
find /data -name "*.odf" -exec cp {} /backup/ \;
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
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. Регулярные выражения |