Поиск файла по названию linux. Команда find: широкие возможности для поиска файлов в Linux. Поиск файлов в определенной папке

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

1) find:
Для поиска файлов из командной строки вы можете использовать команду “find”. У этой команды следующий синтаксис:

find path criteria action


“path”


Секция для указания директории поиска. Если ничего не указано поиск идет по текущей директории.

“criteria”


Опции поиска.

“action”


Опции, которые влияют на состояние поиска или контролируют его, например,

2) locate:
Команда “locate”
это альтернатива команде “find -name”. Команда find ищет файлы в выбранной части файловой системы и процесс может быть не очень быстрым. С другой стороны, команда locate ищет файлы в базе данный, созданной специально для этих целей /var/lib/locatedb, что происходит намного быстрее. Для обновления базы используется команда updatedb
.

3) whereis:
whereis”
возвращает место расположения кода (опция -b), ман-страниц (опция -m), и исходные файлы (опция -s) для указанной команды. Если опции не указываются, выводится вся доступная информация. Эта команда быстрее чем “find”
но менее полная.

4) which:
Команда “which”
ищет все пути перечисленные в переменной PATH для указанной команды.

5) type:

При вызове без опций показывает, как имена будут интерпретироваться

при использовании в качестве имени команды. Если использована опция -a
, команда type
выдает список всех каталогов, где есть выполняемый файл с

соответствующим именем. В список включаются также псевдонимы и функции,

если только не указана опция -p
. К

хэшу команд не обращаются, если указана опция -a
. Команда type
возвращает 0,

если хоть один из аргументов найден, и 1 в противном случае.

Постовой

Explo.ru — все про туризм и отдых: горящие туры и путевки в Турцию, Египет,

Привет всему сообществу Хабра.
Это мой первый пост и, надеюсь, не последний. Поэтому неизбежны всяческие недочеты, баги и некоторая водянистость текста, так что прошу строго не судить:)
К написанию этого поста меня сподвиг топик «Консоль для новичка.» , где ISVir поднял острую, на мой взгляд, тему — как доступным языком рассказать новичкам о консоли, не отпугнув их мнимой сверх-сложностью.

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

Итак, что мы имеем:

find
— поиск файлов. позволяет искать файлы, каталоги, симлинки и другие файловые объекты. find Позволяет задать множество опций поиска таких как:

  • поиск по маске (в имени)
  • контроль глубины вложенности поиска
  • поиск определенных типов файлов(каталог, симлинки, сокеты)
  • поиск по времени создания/модификации файла
  • можно задать размер (от и до в диапазоне) файла
  • выполнение действий с каждым найденным файлом

в мане к find можно прочесть об остальных опциях и параметрах.

Итак, с места в карьер — поиск всех файлов в каталоге /etc/, измененных за последние сутки:

$find /etc/ -type f -mtime -1

разберем, что мы написали:

Первым параметром всегда указывается начальный каталог для поиска.
опция -type
с параметром f
говорит find
, что нужно искать только обыкновенные файлы.
опция -mtime
с параметром -1
указывает find
, что нужно найти файлы, изменившиеся за последние сутки.
«-»
перед 1
задает верхнюю границу диапазона, т.е. «все, что изменилось за последние 24 часа»

Если бы мы указали «+»
перед 1
, то find
нашел бы всех файлы, изменившиеся от 01.01.1970 до вчерашнего дня (более суток назад)
так же можно указать точную дату поставив число без модификатора.

Выполнение действий с найденными файлами.
опция -exec
принимает строку с командой, которая будет выполнятся для каждого найденного файла
параметр передающийся команде обозначается через {}

строка должна заканчиваться символами » \; «

Рассмотрим пример:
* найти в каталоге /tmp все файлы, изменившиеся за последний месяц и скопировать их в каталог
/tmp/backup/

$find /tmp -type f -mtime -30 -exec cp {} /tmp/backup \;

* удалить все каталоги(рекурсивно) с именем logs, изменившиеся за последний день в каталоге
/var/www

$find /var/www -type d -mtime 0 -name logs -exec sudo rm -fr {} \;

параметр d
в опции -type
указывает на поиск только каталогов
опция -name
задает поиск по имени.
здесь стоит добавить, что удалять таким образом файлы не оптимально(медленно).
для удаления у find есть встроенная опция -delete, которая отрабатывает на порядок быстрее.

Рассмотрим утилиту awk
.
awk
— это язык программирования, предназначенный для обработки файлов. Цель его
разработки — облегчить постановку и решение многих задач, связанных с переработкой текстовой информации. По сути, awk
— это утилита, доступная из консоли.
Я по понятным причинам не буду здесь рассматривать приемы написания awk кода — расскажу только про один важный для нас прием.

Во первых, awk может получать данные из STDIN: $echo «test»|awk …

во вторых, awk эффективен при написании однострочников в консоли, т.к. выполняет код, данные ему как параметр:

awk разделяет входной поток на поля и помещает эти поля в переменные вида $1,$2,..$N
по умолчанию, разделитель полей — пробел, но с помощью опции -F»_разделитель_»
это можно переопределить:

$head -4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh

$cat /etc/passwd|awk -F»:» «{print $1}»
root
daemon
bin

Например, у нас в каталоге /var/www есть несколько сайтов. для каждого сайта существует каталог logs, куда пишутся логи апача (для этого сайта).и вот мы хотим узнать суммарный обьем этих логов, а так же найти все логи больше 100Mb.

1.поиск больших логов:

$find /var/www -type f -name «access.log*» -size +100M
/var/www/site1/logs/access.log
/var/www/site2/logs/access.log.1.gz

2.подсчитаем суммарный обьем логов:

Find /var/www/ -type f -name «access.log*» -exec du -k {} \;|awk «{s+=$1}END{print s}»
5071604

так, не пугаться — щас все обьясню:)

Find ищет все файлы по маске (access.log*) и для каждого запускает команду du
.
команда du
печатает размер файла. опция -k
делает вывод в килобайтах.
дальше запускается процессор awk
, просто суммирует первое поле строк (числа) в переменную s
и выводит значение переменной на экран.

Еще примерчик: найдем в системе все файлы и каталоги принадлежищие юзеру test1
и подсчитаем суммарный обьем.

#find / -user test1 -exec du -sm {} \;|awk «{s+=$1}END{print s}»

т.е. здесь с помощью опции -user
find ищет файлы, принадлежашие юзеру test1 и для каждого файла/каталога подсчитываем его размер (команда du)
дальше через конвеер эти данные принимает awk и, как мы делали выше, считает их сумму в Kb.

Ок. думаю, на сегодня хватит.
пост вышел довольно большим, видимо с непривычки:)

Сразу хочу сказать — я не ставил цель просто рассказать об использовании find и awk, а привести примеры именно практического применения в реальных ситуациях.
если статья понравится — продолжу писать в данном направлении.

Спасибо, что уделили время.

Очень часто требуется срочно найти какой-то файл в файловой системе, но где он вы не имеете ни малейшего понятия. И если GUI утилиты для поиска файла надоели или вообще у вас GUI не установлен или вы принципиально им не пользуетесь, то на помощь придут обширные команды для поиска файлов, папок и частей файла в linux.

Поиск файла по имени в базе данных.

С помощью команды locate
можно проводить поиск файла(ов) по части имени файла. Команда сканирует базу данных имен и выдает путь до искомого файла(ов). Мы рекомендуем запускать команду с опцией -i: locate -i
для поиска без учета регистра.
Пример:

[email protected]:~$ locate -i .ogg
/home/subsanek/неизвестно — неизвестно/01 — неизвестно 1 — ???.ogg
/usr/local/Zend/ZendStudio-7.1.2/docs/PHPmanual/book.oggvorbis.html
/usr/local/Zend/ZendStudio-7.1.2/docs/PHPmanual/intro.oggvorbis.html
/usr/share/kde4/apps/bball/bounce.ogg
/usr/share/kde4/apps/klettres/en_GB/alpha/a.ogg
/usr/share/kde4/apps/klettres/en_GB/alpha/b.ogg
/usr/share/kde4/apps/klettres/en_GB/alpha/c.ogg
(усечено)

-вызов команды нашел все файлы в системе с расширение ogg.
locate ищет файлы очень быстро, но это лишь просмотр списка имен из базы данных и если файл создан недавно, то велика вероятность его не найти.
Обновление базы данных.

Обновить базу данных команды locate можно командой (от суперпользователя):
updatedb

Удобочитаемый вывод.

Часто команда locate может дать многотысячный результат который просто промелькнет перед экраном и ничего не даст для ваших глаз, чтобы избежать этого можно перенаправить результат вывода в контейнер:
locate -i .ogg | less

Также можно задать сколько необходимо вывести результатов опцией -n:
locate -i .ogg -n 10

-выведет первые 10 результатов.

Поиск файлов с реальном сканированием.

Команда find выполняет просмотр файловой системы для поиска файла, что делает этот инструмент медленным, но эффективным.
Для поиска по имени обязательно нужно указывать ключ -name
Пример:
find -name filename.txt

По умолчанию find производит поиск рекурсивно в текущем каталоге.

Поиск текста по фрагменту из текста.

Легендарная команда grep может служить практически для любых целей. Я ее люблю применять не только для поиска нужных файлов в каталоге исходного текста. С помощью grep также можно задавать поиск по регулярным выражениям.
Прототип команды:
grep «шаблон поиска» файл_в_котором_искать

Пример:
grep -R «text» /

-команда будет рекурсивно искать во всех текстовых файлах системы слово text.
Grep имеет внушительное количество опций которые могут довольно часто понадобиться:

[email protected]:~$ grep —help
Использование: grep [КЛЮЧ]… ШАБЛОН [ФАЙЛ]…
Поиск ШАБЛОНА в каждом ФАЙЛЕ или в стандартном вводе.
По умолчанию, ШАБЛОН представляет собой простое регулярное выражение (BRE).
Пример: grep -i «hello world» menu.h main.c

Выбор типа регулярного выражения и его интерпретация:
-E, —extended-regexp ШАБЛОН — расширенное регулярное выражение (ERE)
-F, —fixed-regexp ШАБЛОН — строки фиксированной длины, разделённые
символом новой строки
-G, —basic-regexp ШАБЛОН — простое регулярное выражение (BRE)
-P, —perl-regexp ШАБЛОН — регулярное выражения языка Perl
-e, —regexp=ШАБЛОН использовать ШАБЛОН для поиска
-f, —file=ФАЙЛ брать ШАБЛОН из ФАЙЛа
-i, —ignore-case игнорировать различие регистра
-w, —word-regexp ШАБЛОН должен подходить ко всем словам
-x, —line-regexp ШАБЛОН должен подходить ко всей строке
-z, —null-data строки разделяются байтом с нулевым значением, а не
символом конца строки

Дополнительно:
-s, —no-messages подавлять сообщения об ошибках
-v, —revert-match выбирать не подходящие строки
-V, —version вывести информацию о версии и выйти
—help показать помощь и выйти
—mmap использовать отображение в память (mmap) по возможности

Управление выводом:
-m, —max-count=ЧИСЛО остановиться после указанного ЧИСЛА совпадений
-b, —byte-offset печатать вместе с выходными строками смещение в
байтах
-n, —line-number печатать номер строки вместе с выходными строками
—line-buffered сбрасывать буфер после каждой строки
-H, —with-filename печатать имя файла для каждого совпадения
-h, —no-filename не начинать вывод с имени файла
—label=МЕТКА выводить МЕТКУ в качестве имени файла для
стандартного ввода
-o, —only-matching показывать только часть строки, совпадающей с ШАБЛОНОМ
-q, —quiet, —silent подавить весь обычный вывод
—binary-files=ТИП считать, что двоичный файл ТИПА:
binary, text или without-match.
-a, —text то же что и —binary-files=text
-I то же, что и —binary-files=without-match
-d, —directories=ДЕЙСТВ как обрабатывать каталоги
ДЕЙСТВИЕ может быть read (читать),
recurse (рекурсивно), или skip (пропускать).
-D, —devices=ДЕЙСТВ как обрабатывать устройства, FIFO и сокеты
ДЕЙСТВИЕ может быть «read» или «skip»
-R, -r, —recursive то же, что и —directories=recurse
—include=Ф_ШАБЛОН обработать только файлы, подпадающие под Ф_ШАБЛОН
—exclude=Ф_ШАБЛОН пропустить файлы и каталоги,
подпадающие под Ф_ШАБЛОН
—exclude-from=ФАЙЛ пропустить файлы, подпадающие под шаблон
файлов из ФАЙЛА
—exclude-dir=ШАБЛОН каталоги, подпадающие под ШАБЛОН,
будут пропущены
-L, —files-without-match печатать только имена ФАЙЛОВ без совпадений
-l, —files-with-matches печатать только имена ФАЙЛОВ с совпадениями
-c, —count печатать только количество совпадающих
строк на ФАЙЛ
-T, —initial-tab выравнивать табуляцией (если нужно)
-Z, —null печатать байт 0 после имени ФАЙЛА

Управление контекстом:
-B, —before-context=ЧИС печатать ЧИСЛО строк предшествующего контекста
-A, —after-context=ЧИС печатать ЧИСЛО строк последующего контекста
-C, —context[=ЧИС] печатать ЧИСЛО строк контекста,
—color[=КОГДА],
—colour[=КОГДА] использовать маркеры для различия совпадающих
строк; КОГДА может быть always (всегда),
never (никогда), или auto (автоматически)
—color, —colour использовать маркеры для различия совпадающих строк
-U, —binary не удалять символы CR в конце строки (MSDOS)
-u, —unix-byte-offsets выдавать смещение, как-будто нет CR-ов (MSDOS)

Вместо egrep предполагается запуск grep -E. Вместо fgrep предполагается grep -F.
Запуск под именами egrep или fgrep лучше не выполнять.
Когда не задан ФАЙЛ, или когда ФАЙЛ это -, то читается стандартный ввод.
Если указано меньше, чем два файла, то предполагает -h. При нахождении
совпадений кодом завершения программы будет 0, и 1, если нет.При возникновении
ошибок, или если не указан параметр -q, кодом завершения будет 2.

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

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

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

Конечно, поиск файла по имени – самый очевидный способ найти нужный файл.

Для этого используйте:

find -name «query»

Данная команда чувствительна к регистру (то есть, она воспринимает файлы с именем file и File как два разных файла).

Чтобы найти файл по имени без учета регистра, наберите:

find -iname «query»

Чтобы найти файлы, которые не совпадают с определенным шаблоном, нужно инвертировать поиск при помощи флагов -not или метасимвола «!». Обратите внимание, при использовании «!» нужно избегать символов, чтобы оболочка bash не интерпретировала «!» еще до выполнения команды find.

find -not -name «query_to_avoid»

find \! -name «query_to_avoid»

Поиск по типу файла

При помощи параметра «-type» можно указать тип необходимого файла. Это работает так:

find -type type_descriptor query

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

  • f
    : обычный файл;
  • d
    : каталог;
  • l
    : символическая ссылка;
  • c
    : символьные устройства;
  • b
    : блочные устройства.

К примеру, чтобы найти в системе все символьные устройства, нужно выполнить команду:

find / -type c
/dev/parport0
/dev/snd/seq
/dev/snd/timer
/dev/autofs
/dev/cpu/microcode
/dev/vcsa7
/dev/vcs7
/dev/vcsa6
/dev/vcs6
/dev/vcsa5
/dev/vcs5
/dev/vcsa4
. . .

Чтобы найти все файлы, которые заканчиваются на.conf, используйте:

find / -type f -name «*.conf»
/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf
/usr/share/base-files/nsswitch.conf
/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf
/usr/share/rsyslog/50-default.conf
/usr/share/adduser/adduser.conf
/usr/share/davfs2/davfs2.conf
/usr/share/debconf/debconf.conf
/usr/share/doc/apt-utils/examples/apt-ftparchive.conf
. . .

Фильтрация по времени и размеру

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

Размер файла

Чтобы отфильтровать файлы по размеру, используйте параметр -size.

Также нужно внести суффикс в конце значения, чтобы указать размер:

  • c:
    байт
  • k:
    килобайт
  • M:
    мегабайт
  • G:
    гигабайт
  • b:
    блоки по 512 байт

Чтобы найти файлы размером ровно в 50 байт, наберите:

find / -size 50c

Чтобы найти файлы, размер которых меньше 50 байт, используйте символ «-» перед значением:

find / -size -50c

Соответственно, чтобы найти файлы, размер которых превышает 700 мегабайт, используйте перед значением символ +; команда имеет такой вид:

find / -size +700M

Поиск в зависимости от времени

Linux хранит данные о access time, modification time и change time.

  • access time: время последнего обращения к файлу (когда файл был прочитан или дописан);
  • modification time: время последнего изменения содержимого файла;
  • change time: время последнего изменения инода (inode) файла.

Для фильтрации файлов по времени используйте параметры «-atime», «-mtime» и «-ctime» соответственно.

Значение данного параметра указывает, сколько дней назад был изменен файл. Как и в случае с размером файла, можно использовать символы – и +, чтобы получить файлы, измененные меньше чем или больше чем n дней назад.

То есть, чтобы найти файл, содержимое которого было изменено 1 день назад, используйте:

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

find / -atime -1

Чтобы найти файлы, иноды которых были изменены более трех дней назад, введите:

find / -ctime +3

Существуют также сопутствующие параметры, с помощью которых можно указать минуты вместо дней:

Это вернет файлы, содержание которых было изменено минуту назад.

Кроме того, команда find может сравнивать файлы и выводить более новые из них:

find / -newer myfile

Поиск по владельцу и привилегиям

С помощью команды find файлы можно искать по владельцу или правам на файл.

Для того используются параметры –user, –group, и -perm соответственно. Например, чтобы найти файл, принадлежащий пользователю с именем syslog, наберите:

find / -user syslog

Аналогично, чтобы вывести файлы, принадлежащие группе shadow, используйте:

find / -group shadow

Также можно искать файлы с особыми привилегиями.

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

find / -perm 644

Данная строка выведет все файлы с такими правами.

Чтобы вывести все файлы, привилегии которых больше или равны указанным, используйте синтаксис:

find / -perm -644

Это вернет все файлы с дополнительными привилегиями (например, файл с привилегиями 744).

Фильтрация файлов по глубине

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

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

cd
mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
cd ~/test

Чтобы ознакомиться с только что созданной структурой и проверить, все ли создано правильно, используйте команды ls и cd. Затем вернитесь в тестовый каталог test:

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

find -name file1

./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1

. . .

Эта команда вывела достаточно объемный результат. Передав этот результат в счетчик, можно увидеть, что в итоге выведено 1111 файлов.

find -name file1 | wc -l
1111

Конечно, в большинстве случаев этот вывод слишком объемный и неудобный. Попробуйте сузить его.

Для этого можно использовать параметр –maxdepth, чтобы задать максимальную глубину поиска:

find -maxdepth num -name query

Чтобы найти file1 в каталогах level1 и выше, укажите максимальную глубину 2 (1 для каталога верхнего уровня и 1 для каталогов level1).

find -maxdepth 2 -name file1
./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1

Как видите, данный результат имеет гораздо более удобный вид.

Кроме того, можно указать минимальную глубину поиска:

find -mindepth num -name query

Это используется для поиска файлов, которые находятся в конце ветвей каталога:

find -mindepth 4 -name file
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .

Опять же, данный результат будет содержать огромное количество файлов (1000).

Максимальную и минимальную глубину поиска можно комбинировать, чтобы уменьшить диапазон поиска:

find -mindepth 2 -maxdepth 3 -name file
./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .

Выполнение и объединение команд

Утилита find позволяет выполнять любую вспомогательную команду на все найденные файлы; для этого используется параметр –exec. Базовый синтаксис выглядит так:

find параметры_поиска -exec команда_и_параметры {} \;

Символы {} используются в качестве заполнителя для найденных файлов. Символы \; используются для того, чтобы find могла определить, где заканчивается команда.

Для примера можно найти файлы с привилегиями 644 (как в предыдущем разделе) и изменить их привилегии на 664:

cd ~/test
find . -perm 644 -exec chmod 664 {} \;

Затем можно сменить привилегии каталога:

find . -perm 755 -exec chmod 700 {} \;

Чтобы связать несколько результатов, используйте команды -and или -or. Команда –and предполагается, если она опущена.

find . -name file1 -or -name file9

Поиск файлов с помощью команды locate

Команда locate является альтернативой для find. Данная команда, как правило, работает быстрее и может легко производить поиск по всей файловой системы.

Установить эту команду можно при помощи с apt-get:

sudo apt-get update
sudo apt-get install mlocate

Но почему команда locate быстрее, чем find? Дело в том, что locate зависит от базы данных файлов в файловой системе.

Как правило, cron-скрипт обновляет эту базу данных раз в день; но ее можно обновить и вручную. Запустите эту команду:

Запомните: БД нужно регулярно обновлять, чтобы она содержала актуальные данные; в противном случае найти недавно полученные или созданные файлы будет невозможно.

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

Полученный результат также можно фильтровать.

К примеру, чтобы возвращать только файлы, содержащие сам запрос, вместо того чтобы выводить каждый файл, который содержит запрос в ведущих к нему каталогах, можно использовать флаг –b (чтоб искать только basename, базовое имя файла):

Чтобы команда locate возвращала только файлы, которые все еще существуют в файловой системе (то есть, файлы, которые не были удалены в промежутке между последним запуском updated и текущим вызовом locate), используйте флаг –е:

Чтобы просмотреть статистику, занесенную командой locate в каталог, используйте опцию –S:

locate -S
Database /var/lib/mlocate/mlocate.db:
3,315 directories
37,228 files
1,504,439 bytes in file names
594,851 bytes used to store database

Итоги

Команды find и locate – отличные инструменты для поиска файлов в UNIX‐подобных операционных системах. Каждая из этих утилит имеет свои преимущества.

Несмотря на то, что команды find и locate сами по себе очень мощны, их действие можно расширить, комбинируя их с другими командами. Научившись работать с find и locate, попробуйте фильтровать их результаты при помощи команд wc, sort и grep.

Tags: ,

Несомненно, при работе с Linux, иногда возникает необходимость поиска файлов
с определенными характеристиками. Этими характеристиками могут быть размер или тип файла, права доступа и другое.

Наличие в Linux команды find
, во многом помогает справиться с поиском файлов
по различным критериям.

Сегодня мы разберем поиск файлов в Linux
и приведем основные опции команды find
, которые вы сможете применить в своей работе.

Формат команды find
:

find
путь
-опции

где путь
— это каталог, в котором произвести поиск. В качестве пути можно указывать следующие значения:

.
— поиск в текущем каталоге;

/
— поиск от корневого каталога;

~
— поиск в домашнем каталоге.

Что до опций, то тут гораздо бОльший список, с которым крайне необходимо внимательно ознакомиться (это в будущем очень поможет!). Итак, основные опции команды find
:

-name
— поиск файлов по имени, используя приведенный шаблон;

-user
— поиск файлов, принадлежащих указанному пользователю;

-group
— поиск файлов, принадлежащих указанной группе;

-perm
— поиск файлов с указанным режимом доступа;

-type
— поиск файлов определенного типа. Типов тоже достаточно:

  • b — специальный блочный файл;
  • d — каталог;
  • c — специальный символьный файл;
  • f — обычный файл;
  • l — символическая ссылка;
  • p — именованный канал;
  • s — сокет.

-size n
— поиск файлов с размером n единиц;

-mtime -n +n
— поиск файлов, содержание которых изменялось менее чем (-) или более чем (+) дней назад.

Рассмотрим некоторые примеры применения команды find

:

Наиболее часто применяемой опцией является опция -name
, которая производит поиск файлов по имени.

Примеры с опцией -name

:

$ find /mnt/usb -name «*.mp3» -print

произведет поиск всех файлов (об этом свидетельствует знак *), имеющих расширение.mp3 на USB-устройстве, смонтированном в каталог /mnt/usb.

$ find ~ -name «test*» -print

выведет на экран список файлов домашнего каталога, начинающихся на test.

Если вам надо найти файлы, начинающиеся с определенных букв (к примеру, от a до j), то здесь будет удобно применить регулярные выражения, которые крайне удобны в работе:

$ find / -name «*» -print

Вышеуказанная команда позволит отыскать все файлы в системе, начинающиеся с букв от a до j.

Поиск файлов с определенными режимами доступа

Если потребуется найти файлы, имеющие определенные режимы доступа, вам поможет опция -perm
, которая легко в этом поможет.

К примеру, выполним поиск файлов с режимом доступа 775 (владелец и группа имеют полные права и ограничение на запись имеют остальные пользователи), находящихся в текущем каталоге:

$ find . -perm 775 -print

Выполняя поиск при помощи find
с опцией -perm можно использовать и другой способ — можно перед значением режима поставить дефис и тогда будет произведен поиск файлов, для которых установлены все указанные биты разрешений. Причем, остальные биты в этом случае игнорируются.

К примеру, найдем файлы, к которым пользователи группы имеют полный доступ:

$ find . -perm -070 -print

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

Поиск файлов определенного пользователя или группы

Поиск файлов какого-либо определенного пользователя крайне прост в своей реализации. Для этого достаточно выполнить команду:

$ find / -user admin -print

Вышеуказанная команда произведет поиск файлов
в системе, принадлежащих пользователю admin.

Для того, чтобы найти файлы, принадлежащие определенной группе (к примеру managers), выполним команду:

$ find / -group managers -print

Для поиска файлов несуществующих пользователей или групп можно воспользоваться опциями -nouser
и -nogroup
:

$ find / -nouser -print

$ find / -nogroup -print

Поиск файлов определенного типа

Одной из удобных возможностей команды find
, является возможность поиска файлов определенного типа. Рассмотрим варианты использования опции -type
:

Поиск символических ссылок в каталоге /etc:

$ find /etc -type l -print

Вывод на экран списка каталогов, присутствующих в каталоге /mnt/raid

$ find /mnt/raid -type d -print

Поиск файлов определенного размера

Опция -size
позволяет произвести поиск файлов определенного размера и имеет следующий вид при выполнении:

$ find . -size 2000k -print

Вышеуказанная команда отыщет и отобразит на экране файлы размером 2 мегабайта, находящийся в текущем каталоге. Если, к примеру, необходимо найти файлы размером менее 500 килобайт, то вид команды будет следующий:

$ find . -size -500k -print

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

$ find / -size +600M -print

Поиск файлов с использованием опции -mtime

Опция -mtime
позволит вам найти файлы, изменявшиеся в какой-то срок времени.

К примеру, у нас встала задача поиска файлов, находящихся в каталоге /mnt/raid/upload , и изменявшихся за последние 5 дней. В этом нам поможет команда:

$ find /mnt/raid/upload -mtime -5 -print

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

$ find /mnt/raid/upload -7 -print

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

В этой статье мы рассмотрели лишь основные опции команды find, которые помогут вам в вашей работе. Используйте то, что удобно и не переживайте по пустякам!