- Как найти недавно модифицированные файлы в Linux
- Мониторинг за изменениями файловой системы
- Установка
- Базовый пример
- Ну если вы больше ничего не хотите… А разве ещё что-нибудь есть?
- 🐧 Как узнать время и дату изменения файла в системах Linux
- Получение даты последнего изменения файла в Linux с помощью команды date
- Получение даты последнего изменения файла в Linux с помощью команды ls
- Получение даты последнего изменения файла в Linux с помощью команды stat
- Получение даты последнего изменения файла в Linux с помощью команды midnight commander
- Заключение
- Кунг-фу стиля Linux: наблюдение за файлами
- Команда tail
- Меньше — значит больше: полезные возможности команды less
- Наблюдение за файлами с помощью команды watch
- Использование текстового редактора для наблюдения за файлами
- Итоги
Как найти недавно модифицированные файлы в Linux
Зачастую требуется найти файлы, которые были модифицированы/созданы недавно, или за какой-либо промежуток времени. Например, администратор изменял настройки системы, но забыл, где он их сохранил. Или вы хотите проверить изменялись ли, и как, ваши файлы. Если вам необходимо найти недавно измененные файлы в linux, это можно сделать с помощью команды find.
Чтобы найти недавно модифицированные файлы, отсортированные в обратном порядке (то есть файл, измененный последним, будет показан первым), используется команда вида:
Вышеприведенная команда сортирует файлы в /etc (и поддиректориях) в обратном порядке по времени их изменения, и выводит отсортированный список вместе с их расположением в файловой системе и временем последнего изменения. Если вы также хотите проверить директории, опустите опцию «-type f».
Поиск файлов, которые были модифицированы в последние 60 минут в директории /target_directory и во всех ее поддиректориях:
Поиск файлов, которые были модифицированы в последние 2 дня в директории /target_directory и во всех ее поддиректориях:
Поиск файлов, которые были модифицированы в последние 2 дня в директории /target_directory и ее поддиректориях глубиной до 3 уровня:
Вы также можете задать диапазон времени модификации. Поиск файлов, которые были модифицированы в последние 7 дней, но не позднее чем 3 дня назад:
Все эти команды выводят только путь к найденным файлам. Вы можете также детализировать вывод информации с помощью опции «-exec».
Поиск файлов в директории /target_directory (и во всех ее поддиректориях), которые были модифицированы в последние 60 минут и вывод атрибутов файлов:
В качестве альтернативы вы можете использовать для этого команду xargs:
Обратите внимание, что эти команды найдут также файлы, созданные в заданный промежуток времени.
Источник
Мониторинг за изменениями файловой системы
В поисках готового велосипеда для решения задачи мониторинга за изменениями в ФС с поддержкой linux+freebsd наткнулся на приятную python либу watchdog (github, packages.python.org). Которая помимо интересных мне ОС поддерживает также MacOS (есть своя специфика) и Windows.
Тем, кому данный вопрос интересен и кого не отпугнет индийское происхождение автора, прошу .
Установка
Можно взять готовую версию из PIP:
$ pip install watchdog
Сам PIP ставится как пакет python-pip, порт devel/py-pip, etc.
Либо собрать из исходников через setup.py.
Достаточно подробно все расписано в оригинальном руководстве. Правда там описание версии 0.5.4, а сейчас актуальна 0.6.0. Однако, вся разница в правке копирайтов и замене отступа в 4 пробела на отступ в 2. «Google code style» 🙂
Вообще, там довольно много особенностей сборки по версиям самого python так и по целевой платформе. Они все описаны по ссылке выше, но если будет нужно, допишу в статью вкратце на русском.
Кроме того, собрать модуль можно на несовместимой ОС, но тогда в дело вступится fallback-реализация, делающая «слепки» структуры ФС с последующими сравнениями. Возможно, так кто-то и делал у себя при решении подобной задачи 🙂
Сам же я пробовал собрать под ubuntu 11.4 и freebsd-8.2 RELEASE, каких-либо проблем при сборке и работе не возникло.
Базовый пример
Предположим, что нас интересуют изменения по некоему пути /path/to/smth, связанные с созданием, удалением и переименованием файлов и директорий.
Класс Observer выбирается в /observers/__init__.py исходя из возможностей вашей ОС, так что нет необходимости самостоятельно решать, что же выбрать.
Класс FileSystemEventHandler является базовым классом обработчика событий изменения. Он мало что умеет, но мы научим его потомка:
Полный список методов можно увидеть в самом FileSystemEventHandler.dispatch: on_modified, on_moved, on_created, on_deleted.
Запускаем это все:
Observer является относительно далеким потомком threading.Thread, соотвественно после вызова start() мы получаем фоновый поток, следящий за изменениями. Так что если скрипт сразу завершится, то ничего толкового мы не получим. Реалиация ожидания зависит в первую очередь от применения модуля в реальном проекте, сейчас же можно просто сделать костыль:
Ждем событий изменений ФС до прихода Ctrl+C (SIGINT), после чего говорим нашему потоку завершиться и ждем, пока он это выполнит.
Запускаем скрипт, идем по нашему пути и:
На выходе скрипта имеем:
В методы нашего класса Handler в поле event приходят потомки FileSystemEvent, перечисленные в watchdog/events.py.
У всех есть свойства src_path, is_directory, event_type («created», «deleted», и т.п.). Для события moved добавляется свойство dest_path.
Ну если вы больше ничего не хотите… А разве ещё что-нибудь есть?
PatternMatchingEventHandler можно использовать для получения событий только о тех узлах ФС, имена которых подходят по маске с правилами:
- * любые символы
- ? любой единичный символ
- [seq] любой единичный символ из указанных
- [!seq] любой единичный символ НЕ из указанных
Задание правил выполняется при создании:
RegexMatchingEventHandler делает тоже самое, но с явным указанием regexp-выражений в конструкторе:
PatternMatchingEventHandler внутри себя в итоге транслирует шаблоны в регулярки, так что должен работать медленнее из-за наличия такого оверхеда.
Наконец, LoggingEventHandler выводит все в лог через logging.info().
— Вот и все. Может кому пригодится.
P.S.
При слежении за директорией, в которой (и в ее дочерних) содержатся папки/файлы не с ascii именованием, возникнет исключение exceptions.UnicodeEncodeError в глубинах watchdog’а. В Linux (inotify) он возникает в watchdog.observers.inotify.Inotify._add_watch.
Причина — чтение содержимого в ascii кодировке.
Для исправления ситуации можно пропатчить метод:
Вот пример исходной строки, и ее repr() до и после обработки encode():
Источник
🐧 Как узнать время и дату изменения файла в системах Linux
В этом туториале показаны 4 простых способа получения даты последнего изменения файла в Linux.
Прочитав это руководство, вы будете знать, как проверить дату последней модификации файла с помощью команд ls, date и stat и бонус метод с MC.
Получение даты последнего изменения файла в Linux с помощью команды date
Первый способ узнать дату последней модификации файла в Linux, описанный в этой статье, основан на команде date.
Когда за командой date следует флаг -r, она показывает нам дату последней модификации файла.
Следующий пример показывает синтаксис для использования команды date, где itisgood – файл, дату последней модификации которого я хочу вывести.
Как вы можете видеть, вывод очень удобен для пользователя и включает дату и время последней модификации файла.
Для получения дополнительной информации о команде date посетите сайт https://man7.org/linux/man-pages/man1/date.1.html.
Получение даты последнего изменения файла в Linux с помощью команды ls
Второй метод, описанный в этом руководстве, объясняет, как получить дату последнего изменения файла с помощью команды ls.
Сначала используем команду ls с флагом -l, как показано на скриншоте ниже.
Флаг -l указывает команде ls вывести список файлов в длинном формате.
Список в длинном формате включает дату последней модификации файла.
Как вы можете видеть, в первом столбце показаны права, во втором и третьем – пользователи и группы файлов.
Четвертый столбец – размер.
Затем вы можете увидеть месяц, день и время, когда файл был изменен.
В отличие от предыдущего метода с ls, вы получите список всех файлов в каталоге, включая даты их модификации.
Для упорядоченного вывода вы можете добавить флаг -t.
Флаг -t выведет упорядоченный по дате модификации вывод, показывая сначала последние измененные файлы.
как вы видите, последние измененные файлы теперь отображаются первыми.
Команда ls также позволяет проверить дату последней модификации файла по отдельности; для этого просто укажите имя файла, как показано ниже.
Получение даты последнего изменения файла в Linux с помощью команды stat
Третий метод получения даты последней модификации файла в Linux, описанный в этой статье, показывает, как использовать команду stat для достижения этого результата.
Синтаксис довольно прост; просто запустите команду stat, за которой следует имя файла, дату последнего изменения которого вы хотите узнать, как показано в примере ниже.
Как вы можете видеть, вывод показывает больше информации, чем предыдущие команды.
Важно различать даты модификации и изменения.
Строка с именем Modify показывает последний раз, когда файл был изменен.
Строка с именем Change показывает последний раз, когда статус файла изменился; статус включает изменение прав, изменение владельца и т.д.
Вы можете выполнить приведенную ниже команду, чтобы получить в выводе только время модификации, опуская остальную информацию.
Получение даты последнего изменения файла в Linux с помощью команды midnight commander
Вы также можете запустить mc в каталоге, где лежит нужный нам файл и посмотреть дату изменения:
Заключение
Это руководство показывает, что получить дату последнего изменения файла в Linux можно с помощью различных простых методов.
Ни один из описанных методов не имеет особых преимуществ; все они могут быть реализованы легко и без установки дополнительных пакетов.
Для этого руководства я использовал Debian, но все описанные здесь команды доступны во всех дистрибутивах Linux.
Все описанные команды имеют дополнительные возможности, о которых вы можете узнать, прочитав man-страницы, указанные в конце каждого раздела.
Источник
Кунг-фу стиля Linux: наблюдение за файлами
Linux или Unix приятно отличаются от многих других операционных систем тем, что Linux-программы часто выдают сообщения, которые записываются в какой-нибудь журнал. А многие команды даже можно настроить так, чтобы они генерировали бы больше сообщений, чем обычно. Я знаю о том, что в Windows есть средство для просмотра событий, но множество программ не особенно охотно делятся сведениями о своей работе. Это усложняет поиск источников проблем в тех случаях, когда что-то идёт не так, как ожидалось.
В случае с Linux проблема заключается в том, что иногда программы сообщают нам слишком много сведений о своей работе. Как найти в этом море информации именно то, что нужно? Когда киношный хакер сидит перед терминалом и смотрит на текст, прокручивающийся со скоростью 500 строк в секунду, выглядит это впечатляюще. Но в реальной жизни почти бесполезно изучать логи, выводимые на экран с такой скоростью. Хотя, если попрактиковаться, из этого потока информации можно иногда, рискуя ошибиться, выхватить какое-нибудь ключевое слово. Но задачу анализа логов в реальном времени это не решает.
Как и во многих других случаях, в Unix-подобных системах есть инструменты для решения вышеописанной задачи. И, что неудивительно, таких инструментов существует довольно много. Если вы, например, пользовались командой tail , то вы уже видели один из таких инструментов. Но tail — это лишь вершина айсберга.
Давайте рассмотрим пример анализа файла, который можно назвать «матерью всех логов». Это — /var/log/syslog . Попробуйте вывести его на экран с помощью команды cat или less (я, в своих системах, всегда создаю псевдоним more для команды less , поэтому если я вдруг упомяну команду more — знайте, что я имею в виду less ). Этот файл, вероятнее всего, будет очень большим, его размеры будут постоянно расти. В обычной настольной системе он ведёт себя довольно спокойно, но в некоторых старых системах и на серверах в нём можно увидеть последствия бурной деятельности разных программ. В любом случае, за исключением тех ситуаций, когда система только что загружена, в нём будут многие страницы данных.
Хакерский подход к анализу логов
Поиск информации, которая уже присутствует в этом файле, особых сложностей не вызывает. Тут можно воспользоваться grep , или можно загрузить копию файла в текстовый редактор. Проблема заключается в анализе свежей информации. Попробуйте подключить USB-устройство к системе (или отключите его от неё). Вы увидите, как в syslog появились новые записи. А что если в него постоянно добавляются десятки сообщений? Как за ними уследить?
И эта проблема характерна далеко не только для файла syslog . Например, интересно может быть наблюдать за файлом листинга в ходе выполнения долгой компиляции кода. То же относится и к наблюдению за перестроением RAID-массива. В общем-то, в Linux всегда можно найти некий большой файл, постоянно пополняемый свежими сведениями, за которым нужно понаблюдать.
Команда tail
Традиционный подход к наблюдению за файлами, постоянно пополняемыми информацией, заключается в использовании команды tail . Она берёт большой файл и возвращает лишь некоторое количество его последних строк. Эту команду можно вызвать с опцией -f . Тогда она будет ждать появления в файле новых данных и выводить их. Эта опция весьма полезна для наблюдения за файлами, в которые постоянно добавляется что-то новое. Опция -F приводит к практически такому же эффекту, но благодаря ей tail , если не может сразу открыть файл, будет продолжать пытаться открыть его. С помощью опции -m можно задавать количество выводимых последних строк файла, а с помощью опции -c — количество байтов. Опция -s позволяет задавать частоту проверки изменений файла.
Как по мне, так всё это выглядит очень даже хорошо. Попробуйте такую команду:
Вы увидите несколько строк из конца файла системного журнала. А если подключить к компьютеру USB-устройство или отключить такое устройство от компьютера, можно увидеть, как сведения, попавшие в журнал, практически мгновенно выводятся на экране. Повторно запускать tail при этом не нужно.
Возможно, вы уже пользовались этим приёмом. Вышеописанная конструкция хорошо справляется со своей задачей, она известна и применяется довольно часто. Но есть и другие способы наблюдения за файлами, которыми вы, возможно, ещё не пользовались.
Меньше — значит больше: полезные возможности команды less
У команды less есть опция +F , которая превращает эту команду в хорошую замену команды tail . На самом деле, если вы испытаете команду, приведённую ниже, вас может посетить мысль о том, что результаты её работы не очень-то и отличаются от результатов работы tail . Вот эта команда:
Вот как вывод этой команды выглядит на моём компьютере.
Результаты работы команды less
Обратите внимание на то, что в нижней части экрана имеется надпись Waiting for data… . В данный момент утилита less работает практически так же, как и tail . Но если нажать CTRL+C — произойдёт кое-что интересное. Ну — что-то, возможно, и произойдёт. Попробуйте. Если less переходит в командный режим — значит всё в порядке. Теперь можно заниматься всем тем, чем обычно занимаются, просматривая файлы с помощью less . Если же по нажатию CTRL+C работа less прекратится, это будет означать, что ваш Linux-дистрибутив «помог» вам, установив некоторые стандартные опции less с использованием переменной окружения LESS . Попробуйте такую команду:
Если вы увидите, что в списке опций имеется —quit-on-intr , это будет значить, что проблема заключается именно в данной строке. Её надо убрать. После этого переключиться в командный режим можно с использованием CTRL+C . Это, кроме того, означает, что вам нужно запомнить, что для выхода из less используется команда q . Если вы вышли из режима наблюдения за файлом и хотите снова в него вернуться — просто нажмите F .
Если вы пользуетесь less в обычном режиме (то есть — не использовали при запуске утилиты опцию +F ), вы можете нажать клавишу F на клавиатуре для перехода в «tail-режим». А ещё интереснее то, что, нажав ESC-F можно в этом режиме что-то искать, при этом, если в поступающих данных найдётся совпадение с тем, что вас интересует, система вам об этом сообщит.
Команду less можно ещё использовать с ключом —follow-name . Это позволит добиться того же эффекта, что и использование опции -F команды tail .
Наблюдение за файлами с помощью команды watch
Иногда файл, за которым нужно наблюдать, не пополняется новыми данными, добавляемыми в его конец, а просто иногда меняется. Например, это файл /proc/loadavg или многие другие файлы из директории /proc . Использование команд tail или less не особенно хорошо подходит для наблюдения за такими файлами. Тут нам на помощь придёт команда watch :
Результат выполнения команды watch
Эта команда вызывает cat каждые 5 секунд и аккуратно выводит результат. Команда watch поддерживает множество полезных опций. Например, опция -d позволяет выделять отличия, а -p позволяет задействовать высокоточный таймер. Опция -c включает поддержку цвета.
Использование текстового редактора для наблюдения за файлами
Возможно, используемый вами текстовой редактор поддерживает tail-режим. При работе с emacs , например, есть несколько способов это организовать. Не буду рассказывать о том, как это сделать. Просто порекомендую вам эту отличную статью. Я не отношу себя к экспертам в области vim , но полагаю, что если вы пользуетесь этим редактором и хотите наблюдать за файлами, вам понадобится специальный плагин.
Если вы не ищете лёгких путей, то вам, возможно, подойдёт инструмент наподобие lnav, который сделан специально для просмотра логов. Просмотрщики журналов имеются, кроме того, в KDE и Gnome.
Итоги
Как это обычно бывает в Linux и Unix, у задачи организации наблюдения за файлами есть множество решений. Какое из этих решений «лучше» других? У каждого будет собственный ответ на этот вопрос. Именно это и делает Linux системой, привлекательной для продвинутых пользователей. Каждый из них может выбрать именно то, что подходит ему лучше всего.
Те команды, о которых мы говорили, могут пригодиться и тем, кто пользуется настольным дистрибутивом Linux, и тем, кто работает с серверами или с Raspberry Pi.
Как вы наблюдаете за постоянно изменяющимися файлами в Linux?
Источник