ѕодпишитесь на наш Telegram-канал Ѕудьте в курсе последних новостей 👇 😉 ѕодписатьс€
ѕоддержим в трудное врем€ —пециальное предложение на техническую поддержку вашей »“ - инфраструктуры силами наших экспертов ѕодобрать тариф
ѕоставка оборудовани€ √аранти€ и помощь с настройкой. —кидка дл€ наших читателей по промокоду WIKIMERIONET  упить
»нтерфейс статистики Merion Mertics показывает ключевые диаграммы и графики по звонкам, а также историю звонков в формате, который легко поймет менеджер ѕопробовать бесплатно
¬недрение
офисной телефонии
Ўаг на пути к созданию доступных унифицированных коммуникаций в вашей компании ¬недрить
»нтеграци€ с CRM ѕомогаем навести пор€док с данными
и хранить их в единой экосистеме
ѕодключить
»“ Ѕезопастность ”мна€ информационна€ безопасность дл€ вашего бизнеса «аказать
ћерион Ќетворкс

8 минут чтени€

 огда нужно найти какой-нибудь файл или папку в системе Linux в голову сразу приходит команда find. ќна проста в использовании и имеет множество разных опций, которые позвол€ют оптимизировать поиск файлов. ƒалее приведЄм несколько примеров использовани€ этой команды.


ѕоиск папок

„тобы сделать поиск по папкам команде find нужно передать параметр type d. “аким образом мы скажем команде find вести поиск только по директори€м:

$ find /path/to/search -type d -name "name-of-dir"
–уководство по команде find с примерами

ѕоиск скрытых файлов

“ак как скрытые файлы и директории в Linux начинаютс€ с точки, то мы можем задать шаблон поиска так, чтобы команда рекурсивно выводила нам все скрытые файлы и директории. ƒл€ этого достаточно ввести следующую команду:

$ find /path/to/search -name ".*"

ѕоиск файлов по размерам

 оманда find дает возможность вести поиск файлов размером больше, меньше или равным указанному значению. „тобы найти файл размером больше 10ћб нужно ввести команду:

$ find /path/to/search -size +10M

ƒл€ поиска файлов размером меньше указанного значени€ или равного ему нужно ввести следующие команды:

$ find /path/to/search -size -10M
$ find /path/to/search -size 10M

“акже есть возможность искать файлы размер которых находитс€ в указанном промежутке.

$ find /path/to/search -size +100M -size -1G

ѕоиск файлов по списку

ƒопустим нам нужно найти несколько файлов, указанные в списке, который хранитс€ в виде файла с расширением .txt. ƒл€ этого мы можем воспользоватьс€ комбинацией команд find и grep. „тобы данна€ команда работала корректно, каждый шаблона поиска в списке должен начинатьс€ с новой строки.

$ find /path/to/search | grep -f filelist.txt

ѕарметр f переданный команде grep означает файл и даЄт нам возможность указать файл с шаблонами дл€ поиска. ¬ результате работы вышеуказанной команды система вернЄт нам все файлы, название которых указаны в списке.


Ќайти файл, которого нет в списке

“ак же в системе Linux есть возможность поиска, противоположна€ указанному выше. “о есть мы можем искать файлы, которые не указаны в списке файлов. ƒл€ этого команде grep передадим параметр vf, что означает обратное сопоставление и вернет нам файлы, названий которых не найдЄт в списке шаблонов.

$ find /path/to/search | grep -vf filelist.txt

”казываем максимальную глубину поиска

ѕо умолчанию, команда find ищет файлы во всех директори€х и поддиректори€х. ƒопустим, если мы в качестве пути дл€ поиска укажем корневую директорию "/", то система будет искать искомый файл по всему жесткому диску. ћы можем ограничить область поиска командой maxdepth указав ему насколько глубоко нужно искать файл.

$ find . -maxdepth 0 -name "myfile.txt"

 оманды указанна€ выше говорит системе искать файл только в указанной директории. ј следующа€ команда предписывает вести поиск в указанной директории и в одной поддиректори.

$ find . -maxdepth 1 -name "myfile.txt"

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

 оманда find также позвол€ет вести поиск по пустым файлам и директори€м. ƒл€ этого команде добавл€ем флаг empty. —ледующие две команды позвол€ют найти пустые файли и папки. ƒл€ поиска папок к строке поиске добавл€ет ключ d:

$ find /path/to/search -type f empty
$ find /path/to/search -type d empty

“ак же можно автоматически удал€ть найденные пустые файлы или папки. —ледующа€ команда найдет и удалит все пустые файлы в указанной папке и всех подпапках:

$ find /path/to/search -type f -empty delete

ѕоиск самого большого файла или папки

≈сли нужно быстро определить какой файл или кака€ папка в системе занимает больше всего места, то команда find с соответствующими ключами позволит нам рекурсивно искать и сортировать файлы/папки по их размеру:

$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | tail -1

«аметьте, что при поиске мы прибегнули к двум другим удобным инструментам Linux: sort и tail. Sort отсортирует файл по их размеру, а tail покажет самый последний файл в списке, который и будет самым большим файлом/папкой. ћы можем изменить команду так, чтобы она выводила п€ть самых больших файлов дл€ этого нужно воспользоватьс€ следующей командой:

$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | tail -5<

“акже можно вывести файлы с самым меньшим размером. —ледующа€ команда позволит вывести п€ть самых маленьких по объЄму файлов:

$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | head -5

„тобы найти самую большую папку по указанному пути нужно ввести команду указанную ниже:

$ find /path/to/search -type d -printf "%s\t%p\n" | sort -n | tail -1

ѕоиск файлов с атрибутом setuid

јтрибут setuid файла позвол€ет обычному пользователю запускать файлы от имени root-а. “акие файлы тоже легко найти с помощью команды find и нескольких параметров.  оманда имеет два параметра, которые позвол€ют искать файлы с конкретными правами: -user и perm. „тобы найти файлы, который можно запускать от имени root-а можем прописать команду:

$ find /path/to/search -user root -perm /4000
 ак найти файл в Linux

Ќа скриншоте мы добавили еще параметр exec чтобы ограничить вывод команды find. ѕолна€ команда выгл€дит так:

$ find /path/to/search -user root -perm /4000 -exec ls -l {} \;

ћы можем заменить root любым другим пользователем или просто опустить этот параметр и найти все файлы с правами запуска от имени root-а:

$ find /path/to/search -perm /4000

ѕоиск файлов с атрибутом sgid

 оманда поиск файлов с атрибутом sgid почти така€ же как и дл€ SUID с той разницей, что вместо 4000 прописываем 2000:

$ find /path/to/search -perm /2000

“ак же можем найти файлы, которые имеют оба указанных атрибута:

$ find /path/to/search -perm /6000

»сключение из вывода файлов и папок, к которым нет доступа

„тобы вести поиск пользователь должен иметь доступ на чтение в указанной папке и подпапках. ≈сли нет соответствующих прав, то мы получим ошибки как на скриншоте ниже.

Permission denied

Ётот случай особо актуален при поиске в корневой директории. —огласитесь сильно засор€ет вывод, но этого можно избежать если перенаправить вывод stderr в stdout и передать grep дл€ обработки. —ледующей командой мы выведем все результаты работы команды find кроме строк, содержащих слова "Permission denied"^

$ find / -name "myfile.txt" 2>%1 | grep -v "Permission denied"

ѕоиск файлов изменЄнных за последние X дней

„тобы найти файлы, которые были изменены за указанный период времени используетс€ параметр mtime. Ќиже приведены несколько примеров дл€ поиска файлов, изменЄнных за последний 30 дней, больше 30 дней и меньше чем за 30 дней:

$ find /path/to/search -type f -mtime 30
$ find /path/to/search -type f -mtime +30<
$ find /path/to/search -type f -mtime -30

„тобы вывести более детальную информацию о найденных файлах можно указать параметр exec:

$ find /path/to/search -type f -mtime -30 -exec ls -l {} \;

—ортировка результатов по времени

ѕри необходимости отсортировать результате по времени можно воспользоватьс€ параметром printf и утилитой sort:

$ find /path/to/search -printf "%T+\t%p\n" | sort

ѕо умолчанию sort упор€дочивает файлы от старых к новым. „тобы указать обратный пор€док сортировки достаточно добавить ключ r к команде sort:

$ find /path/to/search -printf "%T+\t%p\n" | sort r

–азница между locate и find

¬ системе Linux есть и друга€ команда, позвол€юща€ вести поиск файлов locate. Ќо так как она не имеет таких параметров поиска, как find, она не очень гибка, но достаточно практична.

$ locate myfile.txt

”тилита locate ведЄт поиск по базе, котора€ содержит все имена файлов, наход€щихс€ в системе. “ак как команда locate не ищет указанный файл по всей системе, то она намного эффективней утилиты find. Ќо с другой стороны база данных этой утилиты обновл€етс€ раз в день, что не позвол€ет найти файлы, созданные раньше, чем 24 часов. Ѕазу данных можно вручную обновл€ть командой updatedb.

 оманда locate особенно полезна если нужно вести поиск файла по всему жесткому диску, так как find в этом случае понадобитьс€ больше времени, так как он проходитс€ по всем директори€м в реальном времени.

≈сли же поиск ведЄтс€ в папке, где мало файлов, то лучше пользоватьс€ командой find.


Ќагрузка CPU командой find

ѕри поиске по большим каталогам команда find может требовать больше ресурсов. Ёто должно по своей сути позвол€ть более важным системным процессам иметь приоритет, но если необходимо, чтобы команда find употребл€ла меньше ресурсов машины, можно использовать команду ionice или nice.

ѕросмотреть состо€ние процессора можно командой:

$ top

„тобы понизить приоритет ¬вода/¬ывода дл€ команды find, можно ввести следующую команду:

$ ionice -c3 -n7 find /path/to/search -name "myfile.txt"

ј чтобы понизить приоритет использовани€ CPU, нужно ввести следующую команду:

$ nice -n 19 find /path/to/search -name "myfile.txt"

»ли можно эти две команды комбинировать, чтобы обеспечить низкий приоритет как дл€ ¬вода/¬ывода, так и дл€ CPU.