HomeMapIndexSearchNewsArchivesLinksAbout LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Guido Socher 

Об авторе:Увлекается linux, так как это - бесплатная система, получает  удовольствие от общения с Линуксоидами всего мира. Свободное время посвящает  подруге, прогулкам на велосипеде загородом, Linuxу, слушает радио BBC World Service. 

Письмо автору

Содержание
Поиск файлов по имени
Обзор дерева 
Поиск по содержимому

Поиск файлов.

[Illustration]

Аннотация: Эта статья дает представление о способах поиска файлов по имени и содержанию.


Поиск файлов по имени

Вероятно, Вам знакома такая проблема: Есть файл, и Вы не  помните, куда его положили.

В этом случае удобна команда find. Как ее использовать? Конечно, к этой утилите поставляется большая man-страница, но мы рассмотрим некоторые типичные случаи. Просмотреть  дерево каталогов, начиная с текущего, и найти файл  lostfile.txt:
 
find . -name lostfile.txt -print

find понимает служебные символы. Не забудьте заключить строку, содержащую их, в кавычки, иначе shell будет пытаться транслировать их прежде, чем они будут переданы программе find. Например:
 
find . -name "lost*" -print

Если Вы ищете в большом дереве каталогов, команда find может работать довольно медленно. Иногда удобнее использовать команду locate. Она не ищет файл непосредственно в файловой системе, а просматривает свою базу данных. Такой метод намного быстрее, но база данных может устареть. В некоторых дистрибутивах эта база модифицируется каждую ночь. Вы можете время от времени вручную выполнять команду updatedb, чтобы ее модифицировать. locate ищет подстроки:
 
locate lostfile

Эта команда будет искать файлы lostfile.txt или mylostfile.txt и т.д ...

До сих пор мы искали файлы, точно зная имя файла. Имя файла может быть не lostfile.txt, а lastfile.txt или leastfile.txt или lostfiles.txt или Lotsfile.txt или lostfile.text, и Вы не помните имя точно. Как теперь найти файл? В такой ситуации очень полезна "fault tolerant file find utility" (толерантная к ошибкам утилита поиска файлов), ftff. ftff разрешает сделать несколько "орфографических ошибок" в имени файла при поиске. Эта команда нашла бы все вышеперечисленные файлы: 
 
ftff lostfiles.txt

Допустимое количество орфографических ошибок зависит от длины имени файла, но может быть установлено с помощью  опции -t. Чтобы разрешить максимум 2 ошибки и использовать служебный символ просто наберите:
 
ftff -t2 "lostfiles*"

Утилиту ftff  написал я, она входит в пакет whichman-1.4. Его можно найти по адресу
sunsite.unc.edu/pub/Linux/apps/doctools/whichman-1.4.tar.gz

Иногда необходимо найти все файлы в дереве, имя которых не содержит некоторую строку. Например, все файлы за исключением .o и .c. Имеется несколько возможностей сделать это:
 
find . ! -name "*.o" ! -name "*.c" -print 
find . -print | fgrep -v '.o' | fgrep -v '.c'
если у Вас gnu версия find: 
find | fgrep -v '.o' | fgrep -v '.c'
find | egrep -v '\.[oc]' 

Обзор дерева каталогов

Иногда необходимо получить обзор дерева каталогов. Например, Вы получили новый CD-ROM и хотели бы узнать, что на нем есть. Вы можете просто использовать ls -R. Лично я для удобочитаемости предпочитаю один из следующих способов. Tree ( sunsite.unc.edu/pub/Linux/utils/file/tree-1.2.tgz ) отображает дерево каталогов в виде диаграммы.
 
tree
 или с длинными именами файлов: 
tree -fF

Или используйте добрый старый find. В Gnu версии find, которая обычно поставляется с Linux, имеется возможность изменить формат вывода, чтобы отображать, например, имя файла и его размер: 
 
find . -ls
find . -print или для gnu find: 
find
find . -printf "%7s %p\n"

Можно воспользоваться небольшой  perl процедурой, работающей с командой ls, которая делает подобные вещи. Ее можно загрузить отсюда:  lsperl.gz. Существует много других утилит просмотра дерева каталогов, но для большинства случаев этих вполне достаточно.

Поиск файлов по содержанию (поиск текстовых строк в файлах).

Стандартные утилиты для поиска текстовых строк в файлах - grep/egrep для обычных поисков выражения и fgrep для поиска литеральных строк. Чтобы искать выражение во всех файлах в текущем каталоге, просто наберите:
 
egrep -i "search expression" *

Чтобы искать строки во всех файлах дерева каталогов, объедините find или другие команды поиска имени файла с egrep. Это можно сделать несколькими способами: 
 
egrep -i "expression" `find . -type f -print`
find . -type f -exec egrep -i "expression" /dev/null {} \;
find . -type f -print | xargs  egrep -i "expression"

Если  Вам трудно запомнить эти длинные команды, используйте маленький скрипт, который можно загрузить  отсюда: grepfind.gz. Скрипт еще и удаляет не-печатаемые символы из строки поиска, чтобы Вы случайно не получили в результате поиска egrep-ом  двоичный файл.

Очень интересная программа поиска - agrep. Agrep работает в основном подобно egrep, но позволяет искать с учетом орфографических ошибок. Чтобы искать выражение и разрешить максимум 2 орфографические ошибки, наберите: 
 
agrep -i -2 "search exprission" *

Программа agrep может быть загружена с sunsite sunsite.unc.edu/pub/Linux/utils/text/agrep-2.04.tar.Z или c оригинального сайта  ftp://ftp.cs.arizona.edu/agrep/

Еще одна программа для поиска файлов glimpse - очень мощная утилита поиска. Она использует ту же концепцию, что и locate. Сначала необходимо сформировать базу данных, зато потом поиск происходит очень быстро. Чтобы создать поисковые индескы для содержимого всех файлов, начиная c текущего каталога, наберите:
 
glimpseindex .

После этого Вы можете искать строку во всех файлах, которые были предварительно индексированы
 
glimpse -i -2 "search exprission"

glimpse - тоже допускает орфографические ошибки (как и agrep) и -2 указывает, что разрешены две ошибки. glimpse доступен  на http://glimpse.cs.arizona.edu/


Есть много утилит поиска, особенно для Unix и Linux. Эта статья ни в коем случае не претендует на полноту. Если Вас интересуют другие приемы и утилиты для работы с файлами, просмотрите .lsm файлы в http://sunsite.unc.edu/pub/Linux/utils

Удачи, счастливого поиска.

Перевод на русский: Алексей Цыбань

This website is maintained by Miguel Angel Sepulveda
© Guido Socher 1998
LinuxFocus 1998