- Как найти новые файлы в Linux
- Поиск новых файлов в Linux
- Способ 1. Утилита find
- Способ 2. ls
- Выводы
- MNorin.com
- Блог про Linux, Bash и другие информационные технологии
- Inotify в bash: ловим изменения файловой системы
- Программы inotifywait и inotifywatch
- Как работает inotifywatch
- Как работает inotifywait
- Пишем скрипт, который использует inotify
- Похожие посты:
Как найти новые файлы в Linux
Бывают случаи когда нужно посмотреть все новые, недавно измененные или созданные в произвольный период времени файлы в операционной системе Linux. Например, если вы системный администратор и создали файл конфигурации, но потом забыли где его сохранили или же просто хотите проверить не изменял ли кто-либо корневую файловую систему в последнее время.
Операционная система Linux, как всегда, радует множеством способов для решения этой задачи. В этой инструкции мы рассмотрим некоторые из них.
Поиск новых файлов в Linux
Способ 1. Утилита find
Самый распространенный способ найти новые файлы в linux — это воспользоваться утилитой find. В зависимости от ситуации и потребностей утилите передаются различные параметры, можно искать файлы в конкретном диапазоне дат, новее определенной даты или новее определенного файла. Рассмотрим все подробнее.
Можно вывести все файлы в директории и поддиректориях, а затем отсортировать по дате создания:
find /etc -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r
Но это слишком громоздко, да и не нужны нам все файлы, нам надо только новые. Следующей командой можно получить все файлы, измененные или созданные за последние 60 минут:
Чтобы найти последние измененные файлы linux за последних два дня используете параметр mtime:
Если нужно не углубляться в подкаталоги ниже третьего уровня, используйте опцию maxdepth:
find /etc -maxdepth 3 -mtime -2 -type f
Также можно задать диапазон времени, в котором был создан или изменен файл. Например, чтобы посмотреть новые файлы linux за последние семь дней, но исключая последние три дня, наберите:
find /etc -type f -mtime -7 ! -mtime -3
Все эти команды выводят только путь к файлу, но также можно посмотреть атрибуты с помощью опции —exec. Выведем подробные атрибуты новых файлов, выполнив для каждого из них утилиту ls:
find /etc -type f -mmin -120 -exec ls -al <> \;
Предыдущая команда немного сложна и запутана, намного нагляднее для этого использовать утилиту xargs:
find /etc -type f -mmin -120 | xargs ls -l
Утилита find также позволяет найти файлы новее определенного файла. Например, создадим эталонный файл:
И найдем все файлы в корневом каталоге, созданные после его него:
find / -type f -newer /tmp/test
Способ 2. ls
Этот способ намного проще первого, но за простоту мы платим гибкостью. Команда ls тоже умеет сортировать файлы в директории по дате создания. Просто выполните:
В данном случае самый новый файл будет в самом низу. Если файлов очень много можно обрезать вывод с помощью tail:
Выводы
Возможно, это еще не все способы найти новые файлы в Linux, но тут уже есть из чего выбрать лучшее решение для конкретной ситуации. Как показано в этой статье, базовые команды поиска find и ls могут получить еще большую гибкость в объединении с утилитами сортировки sort, а также фильтрации tail и grep.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
MNorin.com
Блог про Linux, Bash и другие информационные технологии
Inotify в bash: ловим изменения файловой системы
Inotify — это подсистема ядра Linux, которая позволяет отслеживать изменения файловых систем. Использование этой подсистемы позволяет выполнять определенные действия в том случае если вы создали файл, что-то в него записали, открыли, закрыли, удалили и так далее. Использование этого механизма позволяет избавиться от необходимости вставлять в скрипты проверки с таймаутами при помощи команды sleep. Это упрощает логику скрипта, поскольку нам нужно просто ждать информацию об изменениях файловой системы, а при получении информации о том, что что-то изменилось, выполнить необходимые действия. Давайте рассмотрим пример скрипта, использующего inotify.
Программы inotifywait и inotifywatch
Эти программы как раз и помогут нам обеспечить необходимый функционал отслеживания изменений файловой системы. В Debian и Ubuntu они входят в пакет inotify-tools. Установка пакета:
apt-get install inotify-tools
Как работает inotifywatch
Программа inotifywatch собирает статистику доступа к файловой системе при помощи inotify. По окончании работы программа выводит статистическую информацию в виде таблицы, включающей информацию об общем количестве событий, о количестве событий каждого типа и файле, для которого произошло событие. У неё есть ряд параметров, которые можно использовать для изменения параметров работы программы.
Типы событий для отслеживания:
access | Отслеживаемый файл или файл в отслеживаемой директории был прочитан |
modify | Отслеживаемый файл или файл в отслеживаемой директории был записан |
attrib | Метаданные отслеживаемого файла или файла в отслеживаемой директории были изменены. Сюда включаются изменения времени доступа и изменения, права доступа, расширенные атрибуты и так далее. |
close_write | Отслеживаемый файл или файл в отслеживаемой директории был закрыт после открытия его в режиме записи. Это не говорит о том, что в файл были записаны какие-то данные. |
close_nowrite | Отслеживаемый файл или файл в отслеживаемой директории был закрыт после открытия в режиме только для чтения |
close | Отслеживаемый файл или файл в отслеживаемой директории был закрыт, при этом неважно, в каком режиме он был открыт. Имейте в виду, что это событие рализовано просто прослушиванием обоих событий close_write и close_nowrite, поэтому все события будут выведены именно как одно из них, а не как CLOSE. Этот тип скорее как сокращение для двух других типов событий |
open | Отслеживаемый файл или файл в отслежваемой директории был открыт |
moved_to | Файл или директория были перемещены в отслеживаемую директорию. Это событие возникает даже в том случае, когда файл был перемещен в пределах одной и той же директории |
moved_from | Файл или директория были перемещены из отслеживаемой директории. Это событие возникает даже в том случае, когда файл был перемещен в пределах одной и той же директории |
move | Файл или директория были перемещены из отслеживаемой директории или в неё. Это событие реализовано аналогично событию CLOSE, то есть, скорее как псевдоним для двух типов событий, moved_to и moved_from,поэтому все события будут выведены именно как одно из них, а не как MOVE |
move_self | Отслеживаемый файл или директорию были перемещены. После возникновения этого события файл или директория больше не отслеживается. |
create | Файл или директория были созданы в отслеживаемой директории |
delete | Файл или директория были удалены из отслеживаемой директории |
delete_self | Отслеживаемый файл или директория были удалены. После этого события файл или директория больше не отслеживается. Обратите внимание, что это событие может произойти, даже если оно явно не слушалось. |
unmount | Файловая система, накоторой находится отслеживаемый файл или директория, была отмонтирована. Поле возникновения этого события файл или директория перестает отслеживаться.Обратите внимание, что это событие может произойти, даже если оно явно не слушалось. |
Пример работы программы inotifywatch:
$ inotifywatch -r -t 300 /var/cache Establishing watches. Finished establishing watches, now collecting statistics. total attrib open moved_to filename 182 1 1 180 /var/cache/apt/archives/ 1 0 1 0 /var/cache/apt/
Как работает inotifywait
Программа inotifywait работает несколько иначе. Она ждет возникновения события и выводит информацию об этом событии сразу, не дожидаясь сигнала прерывания.
Параметры inotifywait очень похожи на параметры inotifywatch:
События, которые отслеживаются, точно такие же, как для программы inotifywatch.
Пример работы программы inotifywait:
$ inotifywait /var/cache Setting up watches. Watches established. /var/cache/ OPEN,ISDIR apt
Пишем скрипт, который использует inotify
Прежде всего определимся с условиями задачи, которую нам предстоит решить. Есть некоторые директории, куда пользователи загружают файлы (пусть это будут домашние директории пользователей, /home/ИМЯ-ПОЛЬЗОВАТЕЛЯ). Иногда пользователи эти файлы удаляют, поэтому нам нужно отслеживать изменения и при появлении новых файлов (или новых версий уже существующих файлов) копировать их в директорию /backup/ИМЯ-ПОЛЬЗОВАТЕЛЯ.
Для реализации нам нужно отслеживать изменения файловой системы, на которой находится директория /home, определять, что произошло событие закрытия файла после записи в него, получать директорию, в которой произошло закрытие файла, имя самого файла, определять имя директории, в которую планируется копировать файл, создавать её, если она еще не существует, и, собственно, копировать этот файл в эту директорию.
#!/bin/bash SRC_DIR="/home" DST_DIR="/backup" # Функция, которая будет выполнять необходимые действия # В нашем случае копировать в другую директорию make_action()< # Получаем директорию назначения DIR_TO_COPY_TO=$/$> # Создаем ее, если ее еще не существует mkdir -p $DIR_TO_COPY_TO # Копируем файл cp $1$2 $DIR_TO_COPY_TO > IFS=' ' # Отслеживаем закрытие файлов после записи # Получаем вывод в нужном нам формате inotifywait -e close_write --format '%w %f' -m -r $SRC_DIR |\ ( while read do # Получаем имя директории DIR=$(echo $REPLY | cut -f 1 -d' ') # Получаем имя файла FILE=$(echo $REPLY | cut -f 2 -d' ') # Передаем имена директории и файла в функцию make_action $DIR $FILE done )
Как видите, всё достаточно просто. Если необходимо работать с файлами, имена которых содержат пробелы, вы можете использовать параметр «—csv» и разделять поля по запятой, а не по пробелу, как в примере, или добавить какой-то другой символ в строку шаблона вывода. Основной принцип работы при этом не изменится.