Как выполнить задачу при добавлении нового файла в каталог в Linux

Фатмавати Ахмад Заенури/Shutterstock.com

Из этого туториала Вы узнаете, как использовать события файловой системы Linux (уведомлять), чтобы получать уведомления каждый раз, когда файл появляется в каталоге. Вы можете использовать их как триггеры для автоматизации общих задач в вашей системе.

Мы собираемся написать скрипт, который следит за каталогом и воздействует на новые добавляемые файлы. Каждый файл распаковывается и перемещается в другой каталог, как только он обнаружен. Скрипт использует подсистему inotify через утилиту inotify-tools. Но сначала давайте установим инструмент и поэкспериментируем.

Установка inotify-tools и gzip

Используйте apt-get для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.

 sudo apt-get установить inotify-tools gzip 

Экспериментируя с inotify-tools

Давайте начнем с просмотра каталога и выяснения, какие события инициируются при поступлении новых файлов. Мы будем использовать инструмент под названием inotifywatch , который является частью inotify-tools. Создайте новый каталог с именем «входящие»:

 входящий mkdir 

Начните смотреть этот каталог, выполнив следующую команду:

 inotifywatch -v входящие 

Это даст команду inotify следить за всеми событиями файловой системы во «входящем» каталоге. Опция -v позволяет инструменту распечатывать дополнительную информацию о том, что он делает. Мы не указали опцию тайм-аута (- t ), и команда будет продолжать собирать события, пока мы не завершим работу с помощью CTRL + C. На этом этапе наш терминал должен выглядеть примерно так:

Откройте новое окно терминала (или вкладку) и перейдите во входящий каталог. Используйте команду touch, чтобы создать новый файл с именем «newfile».

 cd входящий/коснитесь нового файла

Теперь вернитесь к первому окну терминала и остановите inotifywatch, нажав CTRL + C.

Таблица событий будет передана на консоль с указанием одного экземпляра «create», «open», «attrib» и «close_write». Эти четыре события произошли, когда мы использовали touch для создания нового файла, установки его доступа к файлу. атрибуты, открыл его, чтобы написать нулевой завершающий символ, а затем закрыл его позже. Это лишь некоторые из множества событий, которые можно отслеживать в файловой системе с помощью инструментов inotify. Вы можете увидеть полный список на главной странице inotifywatch.

Для наших целей нас интересуют только два события:

  • «Создать» – когда файл создается в целевой директории.
  • «Move_to» – когда файл перемещается из другого места в целевой каталог.

Давайте попробуем inotifywatch еще раз, но на этот раз проинструктируем его отслеживать только эти два события. Запустите эту команду в первом окне терминала:

 inotifywatch -v -e создать -e перемещенный_в входящий 

Во втором окне или вкладке терминала давайте попробуем создать новый файл, изменить его содержимое, а затем переместить файл из другого места в целевой каталог. Все эти команды запускаются из домашнего каталога.

 нажмите входящий/созданный
echo Testing123 >> входящий/созданный
Touch/TMP/создал2
mv/tmp/создал2 входящий/

Вернитесь к первому окну терминала и остановите inotifywatch, нажав CTRL + C. Мы увидим следующий вывод:

Были подсчитаны только два события: создание файла с именем «create.txt» и перемещение существующего файла с именем «made2.txt». Все остальное, например, изменение «create.txt», было проигнорировано.

Просмотр каталога и выполнение задачи

Теперь, когда мы знаем, какие события следует отслеживать, мы можем использовать другой инструмент под названием inotifywait , чтобы блокировать выполнение, пока файл не будет создан или перемещен в наш целевой каталог. Мы будем использовать те же аргументы, что и для inotifywatch, а также указать, как мы хотим, чтобы имя файла было отформатировано для использования в нашей задаче.

Прежде чем мы начнем, нам нужен каталог для хранения файлов, которые уже были обработаны. Создайте каталог с именем «обработано»:

 обработан mkdir 

Затем создайте новый скрипт с именем «watch-incoming.sh» и добавьте содержимое, указанное ниже:

 #!/Bin/Баш
TARGET = ~/входящих/ОБРАБОТАННЫЙ = ~/обработке/inotifywait -m -e создать -e Move_to --format "% f" $ TARGET \
| пока читаю FILENAME
делать
Обнаружено эхо $ FILENAME, перемещение и архивирование
mv "$ TARGET/$ FILENAME" "$ PROCESSED/$ FILENAME"
gzip "$ PROCESSED/$ FILENAME"
сделанный

Сценарий выполняет команду inotifywait с параметром -m . Это заставляет командный монитор меняться бесконечно. Каждый раз, когда обнаруживается новое событие, имя файла передается команде чтения и вводится в переменную «FILENAME».Выполняется блок в цикле while, в котором файл сначала перемещается в «обработанный» каталог, а затем распаковывается. Исходный файл заменяется сжатым файлом, а имя файла заканчивается на «.gz».

Давайте предоставим права на выполнение этого скрипта и запустим его из нашего домашнего каталога.

 chmod u + x watch-incoming.sh
./watch-incoming.sh 

Откройте второе окно терминала и создайте новый файл во «входящем» каталоге. Перечислите содержимое как «входящих», так и «обработанных» каталогов, чтобы увидеть результаты обнаруженного события:

Необработанный текстовый файл, который мы скопировали в «входящий» каталог, был обнаружен сценарием, скопирован в «обработанный» и затем сжат с помощью gzip.

Теперь мы можем выполнять некоторые интересные задачи, наблюдая за поступающими в каталог новыми файлами. Например, мы могли бы добавить водяной знак в файлы изображений, сжать необработанные видео в формате mp4 и даже загрузить каждый новый файл, который мы видим, в корзину Amazon S3. Этот сценарий является хорошей отправной точкой для развертывания ваших собственных рабочих процессов и автоматизации общих задач в вашей системе.

Оцените статью
TutoryBird.Ru
Добавить комментарий