Поиск файла по названию 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 Позволяет задать множество опций поиска таких как:
- поиск по маске (в имени)
- контроль глубины вложенности поиска
- поиск определенных типов файлов(каталог, симлинки, сокеты)
- поиск по времени создания/модификации файла
- можно задать размер (от и до в диапазоне) файла
- выполнение действий с каждым найденным файлом
Итак, с места в карьер - поиск всех файлов в каталоге /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.gz2.подсчитаем суммарный обьем логов:
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
для поиска без учета регистра.
Пример:
subsanek@subsanek-laptop:~$ 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 имеет внушительное количество опций которые могут довольно часто понадобиться:
subsanek@subsanek-laptop:~$ 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 - сокет.
-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, которые помогут вам в вашей работе. Используйте то, что удобно и не переживайте по пустякам!