- Поиск в Linux с помощью команды find
- Общий синтаксис
- Описание опций
- Примеры использования find
- Поиск файла по имени
- Поиск по дате
- По типу
- Поиск по правам доступа
- Поиск файла по содержимому
- С сортировкой по дате модификации
- Лимит на количество выводимых результатов
- Поиск с действием (exec)
- Чистка по расписанию
- Вывести содержимое найденных файлов
- Сценарий: Знакомство с каталогами UNIX
- Сценарий: Изучение типов файлов в UNIX
- Сценарий: Поиск системных журналов
- Сценарий: Архивирование и деархивирование файлов и директорий
- Сценарий: Cоздание новых текстовых файлов
- Сценарий: Разрезание и склеивание файлов
- Сценарий: Быстрый анализ текстов
- Сценарий: Поиск строк по регулярным выражениям
Поиск в 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 системах он может располагаться в разных местах.
Источник
Вывести содержимое найденных файлов
Цель занятия: знакомство с командной строкой UNIX, командами по работе с файловой системой и командами обработки текстовых файлов.
Сценарий: Знакомство с каталогами UNIX
В этом сценарии будет освещено знакомство с командами UNIX, изучение файловой системы и базовых каталогов, создание рабочей среды в домашнем каталоге пользователя для выполнения всех последующих команд.
Начальные условия: Командная строка после входа в систему.
Получить имя текущего каталога с помощью команды pwd :
Перейти в корневой каталог с помощью команды cd / :
Отметить, как изменилось строка приглашения.
Посмотреть содержимое корневого каталога с помощью команды ls :
Сравнить с использованием « раскарашенного » вывода команды ls -F —color :
Диретории отмечаются синим цветом и знаком « / » после имени.
Посмотреть содержимое домашнего каталога с помощью команды ls -F —color
Возможно, домашний каталог пуст.
Вернуться в домашний каталог с помощью cd без параметров:
Создать директорию test с помощью команды mkdir test :
Посмотреть обновлённое содержимое домашнего каталога ls -F —color :
Создать поддиректорию subtest в директории test командой mkdir test/subtest :
Посмотреть содержимое домашнего каталога и его подкаталогов с помощью ключа рекурсивного просмотра -R в команде ls -F —color -R :
Сценарий: Изучение типов файлов в UNIX
В этом сценарии рассматриваются типы файлов в UNIX: простые файлы, директории, ссылки. Изучаются команды создания и копирования файлов. Показывается разница между жесткими и символическими ссылками, между копированием и переносом файла.
Начальные условия: Командная строка. Директория test после предыдущего сценария.
Cоздать пустой файл с помощью команды touch test/first.txt :
Добавить строку текста в конец файла с помощью команды echo «Hello, world» >> test/first.txt и перенаправления вывода:
Посмотреть содержимое файла с помощью команды cat test/first.txt :
Посмотреть расширенную информацию о каталоге, используя ключ -l команды ls . ls -F —color -l test :
Добавить псевдоним командной оболочки, чтобы сократить размер команды, с помощью команды alias ls=’ls -F —color -l’ :
Посмотреть глубже на директорию test , используя ключи -a и -i . ls -a -i test
Первый столбец – номера индексных узлов файловой системы. Третий столбец – число жёстких ссылок файла.
Перейти в каталог test с помощью команды cd test
Скопировать файл с помощью команды cp first.txt copy1.txt :
Новый файл имеет свой собственный индексный узел.
Переименовать файл с помощью команды mv first.txt orig.txt . mv first.txt orig.txt :
Отметим, что изменилось только имя файла, все остальные атрибуты остались прежними.
Создать жёсткую ссылку командой ln orig.txt copy2.txt :
Добавилась ещё одна ссылка на тот же файл, число ссылок увеличилось на 1.
Создать символическую ссылку командой ln -s orig.txt orig.lnk :
Новый файл имеет новый индексный узел и размер, равный имени файла orig.txt .
Сравним содержимое файлов при обращении к ним по имени:
К одним и тем же данным можно обратиться через жесткую или символическую ссылку.
Сценарий: Поиск системных журналов
В этом сценарии изучается команда поиска файлов и директорий.
Начальные условия: Командная строка, директория test после прошлого сценария.
Перейти в каталог test с помощью команды cd test :
Вывести список всех файлов и директорий в текущей директории, включая содержимое поддиректорий с помощью команды find :
Найти все файлы и дериктории в текущей директории и ее поддиректориях, которые начиняются на « o » с помощью команды find -name «o*» :
Найти все файлы и дериктории в директории /etc и ее поддиректориях, которые начиняются на « o » с помощью команды find /etc -name «o*» :
Найти все обычные файлы в директории /etc и ее поддиректориях, которые начинаются на « o » с помощью команды find /etc -name «o*» -a -type f :
Найти все обычные файлы в директории /var/ и ее поддиректориях, заканчивающиеся на « log »:
Список найденных файлов может быть слишком большим и для его просмотра можно воспользоваться « прокруткой » терминала с помощью клавиш Shift — PgUp и Shift — PgDn
Исключить вывод сообщений об ошибках (например, « Permission denied ») с помощью перенаправления вывода ошибок в специальное устройство /dev/null . Для этого ввести команду find /var -name «*log» -a -type f 2>/dev/null
Создать директорию logs с помощью команды mkdir test/logs :
Скопировать найденные файлы в локальную директорию с помощью параметра -exec команды find . Для этого ввести команду find /var -name «*log» -a -type f -exec cp <> test/logs/ 2>/dev/null :
Были скопированы все файлы, права на чтение которых у нас есть.
Сценарий: Архивирование и деархивирование файлов и директорий
В этом сценарии изучается команда архивирования файлов и директорий. Командная строка, директория test после прошлого сценария.
Перейти в домашнюю директорию с помощью команды cd :
Создать архив с именем test.tar.gz с применением сжатия, содержащий директорию test с помощью команды tar -czf test.tar.gz test :
Создать новую директорию для содержимого архива командой mkdir test2 :
Перейти в новую директорию с помощью команды cd test2 :
Развернуть содержимое архива в текущую директорию с помощью команды tar -xzf ../test.tar.gz :
Убедиться, что содержимое распакованного архива совпадает с оригинальной директорией. Ввести команду ls -l -F :
Сценарий: Cоздание новых текстовых файлов
В этом сценарии изучаются команды для создания и модифицирования текстовых файлов. Командная строка.
Ввести команду echo «One line» :
Данная команда принимает строку в виде аргумента и выводит её на стандартный вывод.
Ввести ту же команду, но перенаправить вывод в файл second.txt с помощью « > ». Ввести команду echo «One line» > second.txt :
Добавить в конец файла second.txt строку « A line » с помощью другого перенаправления echo «A line» >> second.txt :
Вывести содержимое файла с помощью команды cat second.txt :
С помощью команды cat можно создавать многострочные файлы –, если переопределить вывод программы в файл и вводить текст до нажатия Ctrl — D (конец ввода). Ввести команду cat >multiline.txt и набрать текст
Убедиться, что содержимое файла совпадает с введённым текстом, включая все переводы строки. Для этого ввести команду cat multiline.txt
Основным назначением команды cat является объединение файлов, имена которых передаются как аргументы командной строки. Объединить файлы с помощью команды cat orig.txt second.txt multiline.txt > big.txt :
Убедиться, что новый файл содержит строки из перечисленных файлов с помощью команды cat big.txt :
Сценарий: Разрезание и склеивание файлов
В данном сценарии изучается, как выделять информацию, разбитую на части с помощью специального символа-разделителя (например, прообела или символа :), из файлов и создавать новые структурированные файлы.
Начальные условия: Командная строка.
Посмотреть содержимое файла /etc/passwd , в котором содержится информация о пользователях системы, с помощью команды cat /etc/passwd :
Каждая строка хранит запись об отдельном пользователе. Запись состоит из полей, разделённых символом « : ».
Выделить первый столбец в каждой записи, установив разделитель в « : », с потощью команды cat /etc/passwd | cut -f1 -d: :
Отсортировать список пользователей по алфавиту с помощью команды cat /etc/passwd | cut -f1 -d: | sort :
Выделить седьмой столбец в каждой записи, соответствующий командной оболочке пользователя, с помощью команды cat /etc/passwd | cut -f7 -d:
Список содержит много повторяющихся строк.
Удалить повторяющиеся строки командой cat /etc/passwd | cut -f7 -d: | uniq :
Некоторые повторяющиеся строки остались, так как сравниваются только последовательные строки.
Добиться полной уникальности, предварительно отсортировав строки с помощью команды sort . Ввести команду cat /etc/passwd | cut -f7 -d: | sort | uniq :
Выделить первый и седьмой столбец файла /etc/passwd в отдельные файлы. Для этого ввести команды cat /etc/passwd | cut -f1 -d: > users и cat /etc/passwd | cut -f7 -d: > shells :
Объединить результаты с помощью команды paste users shells :
Сценарий: Быстрый анализ текстов
В данном сценарии изучаются команды, которые позволяют провести первичный анализ файла: с чего он начинается, как заканчивается и каков его размер.
Начальные условия: Командная строка.
Получить число строк в файле /etc/passwd с пломощью команды wc -l /etc/passwd :
Или другим способом: посчитав число слов в созданном ранее файле users с помощью команды cat users | wc -w :
Посмотеть первые несколько строк длинного файла с помощью команды head logs/Xorg.0.log :
Аналогично, посмотеть последние несколько строк с помощью команды tail logs/Xorg.0.log :
Это бывает полезно при просмотре системных журналов – в них самые последние события содержатся в конце файлов.
Сценарий: Поиск строк по регулярным выражениям
В данном сценарии рассматривается практическое использование регулярных выражений для поиска по текстовым файлам.
Начальные условия: Командная строка. Директория test/log с найденными системными журналами.
Среди найденных системных журналов посмотреть файл журнала загрузки графичской системы XFree86.0.log с помощью команды less test/log/XFree86.0.log :
Выйти из просмоторщика можно нажатием клавиши q .
Найти все предупреждения в журнале: строка, начинающаяся с « (WW) ». Для этого ввести команду grep «^(WW)» test/log/XFree86.0.log :
Получить все строки, содержащие следующий шаблон: последовательность из 1 или более цифры или буквы, затем символ собаки, затем еще одна последовательность 1 или более цифры или буквы или точки, затем символ точки, затем от двух до четырёх букв (имя домена первого уровня). Также служебный вывод ошибок удаляется (перенаправляется в нулевое устройство). Для этого ввести команду grep «[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\<2,4\>» /etc/* 2>/dev/null :
При работе с несколькими файлами grep по умолчанию использует вывод имени файла перед найденной стокой.
Избавиться от имени файла в начале строки с помощью ключа -h . Ввести команду grep -h «[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\<2,4\>» /etc/* 2>/dev/null :
Для вывода только найденной подстроки используется ключ -o . Ввести команду grep -ho «[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\<2,4\>» /etc/* 2>/dev/null :
Получить все файлы директории /etc/ с помощью команды find /etc -type f 2>/dev/null , игнорируя ошибки:
Для каждого из найденных файлов произвести поиск подстроки « nameserver ». Для этого ввести команду find /etc -type f -exec grep «nameserver» <> \; 2>/dev/null :
Для большего удобства добавить вывод имени файла (ключ -H ) и номера строки (ключ -n ), на которой было найдено совпадение, с помощью команды find /etc -type f -exec grep -Hn «nameserver» <> \; 2>/dev/null :
Таким образом, команда grep может эффективно использоваться вместе с командой find для нахождения информации в файлах.
Источник