Online Documentation Server
 ПОИСК
ods.com.ua Web
 КАТЕГОРИИ
Home
Programming
Net technology
Unixes
Security
RFC, HOWTO
Web technology
Data bases
Other docs

 

 ПОДПИСКА

 О КОПИРАЙТАХ
Вся предоставленная на этом сервере информация собрана нами из разных источников. Если Вам кажется, что публикация каких-то документов нарушает чьи-либо авторские права, сообщите нам об этом.




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

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


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

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

В этом случае удобна команда 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

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

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

© Guido Socher 1998
LinuxFocus 1998



With any suggestions or questions please feel free to contact us