Расширенные возможности использования команды find в UNIX

Исследуйте файловую систему UNIX® при помощи команды find. Одной из наиболее мощных и полезных команд в арсенале UNIX-программиста является find. В файловых системах UNIX могут находиться тысячи файлов самых различных типов. С таким большим количеством хранящихся файлов часто бывает трудно найти какой-либо конкретный файл или набор файлов. Команда find может упростить эту задачу различными способами.

Билл Циммерли, специалист в области инженерии знаний, Рязанский государственный радиотехнический университет

Билл Циммерли (Bill Zimmerly) является специалистом в области инженерии знаний, а также программистом языков низкого уровня. Он имеет большой опыт работы с различными версиями программного обеспечения UNIX® и Microsoft® Windows®. Билл с огромным энтузиазмом и удовольствием занимается созданием новых технологий и рассказывает о них в своих статьях. Живет он в деревушке Хиллсборо, Миссури, где может наслаждаться чистым воздухом и прекрасной природой. Кроме того, неподалеку находятся несколько винных заводов. Связаться с ним можно по адресу электронной почты: bill@zimmerly.com.



16.10.2008

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

Операционная система UNIX® очень похожа на обширную неразмеченную на карте дикую местность. И по ходу путешествия по этой неизведанной земле можно найти инструменты, которые пригодятся в дальнейшем. Команда find является таким инструментом. Команда find может даже больше, чем просто находить файлы; она может автоматически выполнять последовательность других команд UNIX, передавая обнаруженные файловые имена на вход другим командам, как будет объяснено в этой статье.

Почти неограниченный поиск

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

Стандартные инструменты find, интегрированные в графический интерфейс пользователя (GUI), позволяют выполнять несколько общих задач с найденными файлами: их можно выбрать для вырезания, вставки, копирования; эти файлы можно переместить в новый каталог; можно открыть их программой, при помощи которой эти файлы были созданы. Эти операции состоят из двух и более шагов и не являются автоматическими – сначала выполняется поиск файлов, затем, с использованием GUI-интерфейса, эти файлы помечаются для выполнения следующей операции. Этот подход хорошо подходит для многих пользователей, но исследователь хочет большего.

Команда find может удалять, копировать, перемещать и выполнять найденные файлы. Дополнительно, с параметром -exec, find может автоматически прогонять файлы через любую нужную последовательность команд UNIX. find может даже запросить подтверждение перед выполнением подобных операций с любым файлом.

Упрощение управления файловой системой

Команда find, как и большинство команд в UNIX, имеет огромное количество возможных опций и флагов, которое может отпугнуть людей от подробного изучения данной команды, но истинные исследователи не испугаются большого количества опций. Есть хороший общий принцип – к упрощению сложного вопроса ведет долгий путь. Запустите xterm, и выполните следующую команду:

$ find . -name *.gif -exec ls {} \;

Параметр -exec очень полезен. Когда файл, удовлетворяющий поисковым критериям, найден, параметр -exec определяет, что делать с этим файлом. В этом примере компьютеру дается последовательность команд:

  1. Выполнить поиск по всему содержимому текущего каталога – точка (.) после find.
  2. Найти все файлы, чье имя заканчивается на .gif (графические файлы).
  3. Вывести список всех найденных файлов, используя команду ls.

Параметр -exec требует дальнейшего изучения. Когда обнаружено имя файла, удовлетворяющее поисковому запросу, команда find выполняет строку ls {}, подставляя имя файла и путь к нему в {}. Если будет найден файл saturn.gif, find выполнит команду:

$ ls ./gif_files/space/solar_system/saturn.gif

Оставшаяся часть статьи строится на следующем основном принципе: вдумчивое использование команды find может значительно упростить управление файловой системой UNIX. Например, используя параметр –fstype, команда find может выполнять команды, зависящие от типа файловой системы, в которой был найден файл. Кроме того, было бы полезно, если бы find выводила запрос на подтверждение перед тем как выполнять какие-либо команды над найденным файлом; сделать это можно при помощи параметра –ok, как будет показано далее.

Дополнительные возможности

Важной альтернативой параметру -exec является параметр -ok; его поведение такое же, как у -exec, но перед выполнением какой-либо команды над найденным файлом он выводит предупреждение пользователю. Предположим, что необходимо файл за файлом (file-by-file) удалить большую часть .txt-файлов в домашнем каталоге. При автоматизированном поиске find операции удаления, такие как команда rm в UNIX, опасны, поскольку возможно непреднамеренное удаление важных файлов; возможно, следует изучить все найденные файлы перед тем как удалять их.

Следующая команда выводит список всех .txt-файлов в домашнем каталоге. Чтобы удалить эти файлы, необходимо, когда команда find выведет имя файла, ввести Y или y:

$ find $HOME/. -name *.txt -ok rm {} \;

Каждый найденный файл выводится подобным образом, а система делает паузу для ввода Y или y. Система не удалит файл, если нажать клавишу Enter. Листинг 1 содержит пример результатов работы команды find.

Листинг 1. Пример результатов
< rm ... /home/bill/./.kde/share/apps/karm/karmdata.txt > ?
< rm ... /home/bill/./archives/LDDS.txt > ?
< rm ... /home/bill/./www/txt/textfile1.txt > ?
< rm ... /home/bill/./www/txt/faq.txt > ?
< rm ... /home/bill/./www/programs/MIKE.txt > ?
< rm ... /home/bill/./www/programs/EESTRING.txt > ?
.
.
.

После каждого вопросительного знака система останавливается; в этом случае для перехода к следующему файлу была нажата клавиша Enter (никакие файлы не были удалены). Параметр -ok позволяет управлять автоматической обработкой каждого файла, делая более безопасным процесс автоматического удаления файлов.

Бывает так, что при использовании параметра –ok требуется подтверждать или отклонять удаление слишком большого количества файлов по отдельности. В таком случае для вывода имен всех файлов, которые надо удалить, следует выполнить команду find с параметром –exec ls. Затем, изучив список и убедившись, что важные файлы не будут удалены, выполните команду еще раз, заменив ls на rm.

И -exec и -ok – полезные параметры, однако прежде чем их использовать, нужно решить, какой из них наиболее подходит для конкретной ситуации. Помните, что безопасность превыше всего!

Используйте find творчески

При помощи команды find можно выполнить бессчетное множество задач. Этот раздел рассматривает несколько способов применения find для управления файловой системой.

Чтобы не усложнять ситуацию, в этих примерах не используются -exec команды, которые перенаправляют вывод из одной команды в другую. Однако представленные ниже команды можно свободно использовать с параметром -exec команды find.

Удаление временных файлов

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

$ find . \( -name a.out -o -name '*.o' -o -name 'core' \) -exec rm {} \;

Маски файла (file masks), которые находятся в круглых скобках, определяют типы файлов, которые должны быть удалены; перед каждой маской файла стоит -name. Этот список можно расширить и включить в него любые типы временных файлов, которые нужно удалить из системы. Если рассматривать компилирование и компоновку кода, программисты и их инструментальные средства генерируют файлы следующих типов, указанных в примере: a.out, *.o и core. Другие пользователи имеют подобные часто генерируемые временные файлы и могут отредактировать строку команды под соответствующие типы файлов (используя маски файлов *.tmp, *.junk и прочие). Также будет полезным поместить эту команду в сценарий clean, который можно будет выполнить всякий раз, когда понадобится очистить каталог.

Копирование содержимого каталогов

Команда find позволяет целиком скопировать содержимое каталога, сохраняя при этом права доступа, временные метки и имя владельца для каждого файла и подкаталога. Чтобы сделать это, необходимо скомбинировать использование команд find и cpio как показано в листинге 2.

Листинг 2. Комбинирование команд find и cpio
$ cd /path/to/source/dir

$ find . | cpio -pdumv /path/to/destination/dir

Команда cpio предназначена для копирования файлов в/из cpio или tar архива, при этом автоматически сохраняя права доступа, временные метки и имена владельцев файлов и подкаталогов.

Вывод первых линий текстовых файлов

Некоторые пользователи используют первую строку каждого текстового файла в качестве заголовка или описания содержимого файла. Отчет, содержащий список имен текстовых файлов и их первых строк, может сильно упростить процесс «просеивания» нескольких сотен текстовых файлов. Следующая команда в своем отчете перечисляет первую строку в каждом текстовом файле из домашнего каталога и записывает ее в файл. Потом файл можно просмотреть командой less (см. листинг 3).

Листинг 3. Команда less
$ find $HOME/. -name *.txt -exec head -n 1 -v {} \; > report.txt

$ less < report.txt

Обслуживание каталогов с LOG и TMP-файлами

Для обслуживания каталогов, хранящих LOG- и TMP-файлы, которые используются приложениями, создающими множество подобных файлов, можно поместить следующие команды в утилиту cron, которая выполняется раз в день (см. листинг 4).

Листинг 4. Обслуживание хранилищ LOG- и TMP-файлов
$ find $LOGDIR -type d -mtime +0 -exec compress -r {} \;

$ find $LOGDIR -type d -mtime +5 -exec rm -f {} \;

Первая команда просматривает все подкаталоги (-type d), найденные в каталоге $LOGDIR. Те каталоги, файлы в которых изменялись за последние 24 часа (-mtime +0), сжимаются (compress -r {}) для экономии дискового пространства. В целях увеличения свободного пространства на диске вторая команда удаляет файлы (rm -f {}), если они не используются более недели (-mtime +5). Таким образом, в заданные интервалы времени cron автоматически выполняет архивирование каталогов.

Копирование сложных деревьев каталогов

Бывает так, что нужно скопировать сложные деревья каталогов с одного компьютера на другой. При этом нужно сохранить права доступа, пользовательский идентификатор, идентификатор группы (UID и GID используются операционной системой для маркирования прав доступа), а индивидуальные пользовательские документы копировать не требуется. В таком случае следует снова использовать find и cpio (см. листинг 5).

Листинг 5. Копирование сложного дерева каталогов
$ cd /source/directory

$ find . -depth -print | cpio -o -O /target/directory

Поиск "мертвых" ссылок

Чтобы найти ссылки, которые никуда не ведут, следует использовать интерпретатор perl с командой find:

$ find / -type l -print | perl -nle '-e || print';

Эта команда начинает свой обход с самого верхнего каталога (/) и выводит все ссылки (-type l -print), которые, на взгляд интерпретатора perl, никуда не ведут (-nle '-e || print'). Для получения более исчерпывающей информации об этом способе изучите раздел Ресурсы, сайт Unix Guru Universe. Если нужно удалить эти файлы, можно перенаправить вывод на rm -f {}. Perl, как и многие другие интерпретируемые языки, можно найти в различных инструментариях UNIX.

Поиск и переименование непечатаемых каталогов

Неправильно работающая или вредоносная программа, работающая на UNIX, может создать каталог, чье имя будет включать в себя непечатаемые символы. Поиск и переименование таких каталогов позволяет упростить их обследование и удаление. Первое, что надо сделать для достижения этой цели: с командой ls следует использовать флаг –I, чтобы получить inode. Затем используйте find для преобразования номера inode в имя файла, которое может быть изменено командой mv (см. листинг 6).

Листинг 6. Поиск и переименовывание каталогов с непечатаемыми именами
$ ls -ail

$ find . -inum 211028 -exec mv {} newname.dir \;

Вывод списка пустых файлов

Чтобы вывести все пустые файлы, можно использовать следующую команду:

$ find . -empty -exec ls {} \;

После того как все они будут найдены, их можно будет удалить, заменив команду ls на команду rm.

Очевидно, что возможности применения UNIX-команды find зависят только от знаний и изобретательности читателя.

Заключение

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

Ресурсы

Научиться

  • Advanced techniques for using the UNIX find command: оригинал статьи (EN).
  • Commands Reference, Volume 2, find Command (EN): статья с дополнительной информацией о применении команды find в IBM® AIX®.
  • Unix Guru Universe (UGU): этот Web-сайт является превосходным источником информации по UNIX.
  • UHACC - Presentations: using find (EN): статья с советами о том, как при помощи различных доступных опций ускорить поиск, используя find.
  • Use free software within commercial UNIX (developerWorks, февраль 2006): эта статья рассматривает, насколько в различных коммерческих UNIX-системах могут отличаться по функциональности команды find или tar. Она поможет оценить совместимость GNU-программ с коммерческими UNIX-системами.
  • developerWorks technical events and webcasts: новости о Web-конференциях и событиях сообщества developerWorks.
  • AIX и UNIX: в данном разделе сайта developerWorks можно найти различную информацию по системному администрированию AIX и повышению квалификации работы с UNIX.
  • Новичок в AIX и UNIX?: страница AIX и UNIX для новичков.
  • Podcasts: аудиозаписи презентаций экспертов IBM.
  • Магазин технической литературы: интернет-магазин книг по различным технологиям.

Получить продукты и технологии

  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которое можно загрузить со страниц сообщества developerWorks.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=345816
ArticleTitle=Расширенные возможности использования команды find в UNIX
publish-date=10162008