- Как искать файлы из командной строки Linux
- Найти по названию
- Поиск по типу
- Вывод результатов в файл
- Поиск файлов по размеру
- Продолжай учиться
- Поиск в Linux с помощью команды find
- Общий синтаксис
- Описание опций
- Примеры использования find
- Поиск файла по имени
- Поиск по дате
- По типу
- Поиск по правам доступа
- Поиск файла по содержимому
- С сортировкой по дате модификации
- Лимит на количество выводимых результатов
- Поиск с действием (exec)
- Чистка по расписанию
Как искать файлы из командной строки Linux
Вы можете находить нужные файлы намного быстрее, на ваших серверах и настольных компьютерах с установленной Linux без необходимости использования графического интерфейса.
Само собой разумеется, что каждая хорошая графическая оболочка рабочего стола Linux предлагает возможность поиска по вашей файловой системе файлов и папок. Если ваш рабочий стол по умолчанию не работает, потому что это Linux, вы всегда можете установить приложение, чтобы сделать поиск в иерархии каталогов в несколько символов, через «Терминал».
Но как насчет командной строки? Если вам приходится часто работать в командной строке или вы администрируете GUI-less Linux-серверы, куда вы обращаетесь, когда вам нужно найти файл? К счастью, Linux имеет именно то, что вам нужно для поиска файлов, о которых идет речь, и все это уже встроено прямо в систему.
Эта команда находится в поиске. Чтобы вам было еще удобнее находится в этой середе, как только вы начнете ею пользоваться, вам необходимо начать использовать в своих скриптах Bash. Это не только удобно, но и быстро.
Давайте начнем с команды find, чтобы вы могли управлять размещением файлов на ваших серверах и настольных компьютерах Linux без необходимости использования графического интерфейса.
Как использовать команду
Когда я впервые увидел Linux, я не совсем понял, как работает команда find; Поэтому он никогда не работал так, как я ожидал. Но все оказалось намного проще, чем я думал. Выполните команду find FILENAME (где FILENAME — имя файла), и команда должна была найти файл и отчитаться пользователю. Мало ли я знал, что командование будет больше, чем это. Намного больше.
Если вы выполните команду man find, вы увидите синтаксис команды find:
Естественно, если вы не знакомы с тем, как работает «man», вы можете быть смущены или даже ошеломлены этим синтаксисом. Для простоты понимания давайте упростим смысл этой команды. Самый простой синтаксис базовой команды find будет выглядеть так:
Теперь мы увидим это в работе.
Найти по названию
Давайте разберем эту базовую команду, чтобы сделать ее максимально понятной для каждого. Наиболее упрощенная структура команды find должна включать путь к файлу, параметр и имя самого файла. Возможно, вы подумаете: «Если я знаю путь к файлу, я уже знаю, где его найти!». Ну, путь к файлу может быть корнем вашего диска; Поэтому / будет законным путем. Но все намного проще, поскольку ваш путь займет больше времени, для обработки — потому что он должен начинаться с нуля — но, если вы не знаете, где находится файл, вы можете начать с него. Во имя эффективности всегда лучше иметь хотя бы идею, с которой начать поиск.
Следующая часть команды — это опция. Как и в большинстве команд Linux, у вас есть ряд доступных опций. Тем не менее, мы начинаем с самого начала, поэтому давайте сделаем это как можно проще. Поскольку мы пытаемся найти файл по имени, мы будем использовать один из двух вариантов:
Name — с учетом регистра
Iname – без учета регистра
Помните, Linux очень определенно относится к делу, поэтому, если вы ищете файл с именем Linux.odt, следующая команда не даст никаких результатов.
Если, однако, вы должны были изменить команду, используя опцию -iname, команда find найдет ваш файл, независимо от случая. Итак, новая команда выглядит так:
Поиск по типу
Что, если вы не заинтересованы в поиске файла по имени, а скорее будете предпочитать находить все файлы определенного типа и форматов? Некоторые из наиболее распространенных файловых дескрипторов:
- F — обычный файл
- D — каталог
- L — символическая ссылка
- C — символьные устройства
- B — блочные устройства
Теперь предположим, что вы хотите найти все блокирующие устройства (файл, который ссылается на устройство) в вашей системе. С помощью опции -type мы можем сделать это следующим образом:
Вышеприведенная команда привела бы к довольно большому количеству результатов (большая часть из которых указывала на запрещенное разрешение), но включала бы вывод, подобный этому:
Вуаля! Блокировать устройства.
Мы можем использовать тот же параметр, который может помочь нам найти файлы конфигурации. Например, вы хотите найти все «обычные» файлы, которые заканчиваются расширением conf. Тогда эта команда будет выглядеть примерно так:
Вышеупомянутая команда просматривала всю структуру каталогов, чтобы найти все обычные файлы, заканчивающиеся на .conf. Если вы знаете, что большинство ваших файлов конфигурации размещены в / etc, вы можете указать, это вот так:
Вышеупомянутая команда отобразит все ваши .conf-файлы из / etc (Рисунок 1).
Вывод результатов в файл
Один очень удобный трюк — вывести результаты поиска в файл. Когда вы знаете, что результат может быть обширным, или если вы захотите прочесть результаты позже, это может оказаться невероятно полезным. Для этого мы будем использовать тот же пример, что и выше, и перенесем результат в файл с именем conf_search. Такая новая команда будет выглядеть примерно так:
find /etc -type f -name “*.conf” > conf_search
Теперь у вас будет файл (conf_search), который содержит все результаты команды find.
Поиск файлов по размеру
Теперь мы дойдем до того момента, когда команда find станет невероятно полезной. У меня были случаи, когда десктопы или серверы просто находили свои жесткие диски загадочно заполненными. Для того чтобы быстро освободить место (или помочь найти проблему), вы можете использовать команду find, чтобы найти файлы определенного размера. Скажем, например, вы хотите увеличить размер и найти файлы размером более 1000 МБ. Команда find может быть выдана с помощью опции -size, например:
Вы можете быть удивлены, сколько файлов появится в списке. С выводом команды вы можете прочесать структуру каталогов и высвободить место или устранить неполадки, чтобы выяснить, что «таинственно» заполняет ваш диск. Такой способ является очень удобным и может пригодится огромному количеству пользователей.
Вы можете выполнить поиск со следующими описаниями размеров:
- C — байт
- K — Килобайты
- M — мегабайт
- G — гигабайт
- B — 512-байтовые блоки
Продолжай учиться
Мы только поверхностно рассказали про команды find, но теперь у вас есть фундаментальное понимание того, как находить файлы на ваших Linux-системах. Убедитесь, что вы поняли команду man find, чтобы получить более глубокое и более полное представление о том, как заставить этот мощный инструмент работать на вас.
Если у вас остались вопросы по теме «Как искать файлы из командной строки Linux» то, пишите нам про них в форму комментариев на нашем сайте. Также обязательно расскажите был ли этот инструмент полезен вам при поиске файлов в Linux. Спасибо большое за визит!
Источник
Поиск в Linux с помощью команды find
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Общий синтаксис
— путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».
— набор правил, по которым выполнять поиск.
* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.
Описание опций
Опция | Описание |
---|---|
-name | Поиск по имени. |
-iname | Регистронезависимый поиск по имени. |
-type | |
-size | Размер объекта. Задается в блоках по 512 байт или просто в байтах (с символом «c»). |
-mtime | Время изменения файла. Указывается в днях. |
-mmin | Время изменения в минутах. |
-atime | Время последнего обращения к объекту в днях. |
-amin | Время последнего обращения в минутах. |
-ctime | Последнее изменение владельца или прав на объект в днях. |
-cmin | Последнее изменение владельца или прав в минутах. |
-user | Поиск по владельцу. |
-group | По группе. |
-perm | С определенными правами доступа. |
-depth | Поиск должен начаться не с корня, а с самого глубоко вложенного каталога. |
-maxdepth | Максимальная глубина поиска по каталогам. -maxdepth 0 — поиск только в текущем каталоге. По умолчанию, поиск рекурсивный. |
-prune | Исключение перечисленных каталогов. |
-mount | Не переходить в другие файловые системы. |
-regex | По имени с регулярным выражением. |
-regextype | Тип регулярного выражения. |
-L или -follow | Показывает содержимое символьных ссылок (симлинк). |
-empty | Искать пустые каталоги. |
-delete | Удалить найденное. |
-ls | Вывод как ls -dgils |
Показать найденное. | |
-print0 | Путь к найденным объектам. |
-exec <> \; | Выполнить команду над найденным. |
-ok | Выдать запрос перед выполнением -exec. |
Также доступны логические операторы:
Оператор | Описание |
---|---|
-a | Логическое И. Объединяем несколько критериев поиска. |
-o | Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска. |
-not или ! | Логическое НЕ. Инвертирует критерий поиска. |
Полный набор актуальных опций можно получить командой man find.
Примеры использования find
Поиск файла по имени
1. Простой поиск по имени:
find / -name «file.txt»
* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.
2. Поиск файла по части имени:
* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp
3. Несколько условий.
а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:
find . -name «sess_*» -a -name «*cd»
б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:
find . -name «sess_*» -o -name «*cd»
в) Более компактный вид имеют регулярные выражения, например:
find . -regex ‘.*/\(sess_.*cd\)’
* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).
4. Найти все файлы, кроме .log:
find . ! -name «*.log»
* в данном примере мы воспользовались логическим оператором !.
Поиск по дате
1. Поиск файлов, которые менялись определенное количество дней назад:
find . -type f -mtime +60
* данная команда найдет файлы, которые менялись более 60 дней назад.
2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find —version).
а) дате изменения:
find . -type f -newermt «2019-11-02 00:00»
* покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.
find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02
* найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).
б) дате обращения:
find . -type f -newerat 2019-10-08
* все файлы, к которым обращались с 08.10.2019.
find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01
* все файлы, к которым обращались в октябре.
в) дате создания:
find . -type f -newerct 2019-09-07
* все файлы, созданные с 07 сентября 2019 года.
find . -type f -newerct 2019-09-07 ! -newerct «2019-09-09 07:50:00»
* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50
По типу
Искать в текущей директории и всех ее подпапках только файлы:
* f — искать только файлы.
Поиск по правам доступа
1. Ищем все справами на чтение и запись:
find / -perm 0666
2. Находим файлы, доступ к которым имеет только владелец:
find / -perm 0600
Поиск файла по содержимому
find / -type f -exec grep -i -H «content» <> \;
* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.
С сортировкой по дате модификации
find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r
* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.
Лимит на количество выводимых результатов
Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:
find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r | head -n 1
Поиск с действием (exec)
1. Найти только файлы, которые начинаются на sess_ и удалить их:
find . -name «sess_*» -type f -print -exec rm <> \;
* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.
2. Переименовать найденные файлы:
find . -name «sess_*» -type f -exec mv <> new_name \;
find . -name «sess_*» -type f | xargs -I ‘<>‘ mv <> new_name
3. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:
find . -name «*.tmp» | wc -l
4. Изменить права:
find /home/user/* -type d -exec chmod 2700 <> \;
* в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.
5. Передать найденные файлы конвееру (pipe):
find /etc -name ‘*.conf’ -follow -type f -exec cat <> \; | grep ‘test’
* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.
6. Произвести замену в файлах с помощью команды sed:
find /opt/project -type f -exec sed -i -e «s/test/production/g» <> \;
* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.
Чистка по расписанию
Команду find удобно использовать для автоматического удаления устаревших файлов.
Открываем на редактирование задания cron:
0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.
Источник