Вывести содержимое найденных файлов

Поиск в Linux с помощью команды find

Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.

Общий синтаксис

путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».

набор правил, по которым выполнять поиск.

* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.

Описание опций

Тип объекта поиска. Возможные варианты:

  • f — файл;
  • d — каталог;
  • l — ссылка;
  • p — pipe;
  • s — сокет.
Опция Описание
-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
-print Показать найденное.
-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 для нахождения информации в файлах.

Источник

Читайте также:  Как вывести масляное пятно с плаща
Оцените статью