Як виконати завдання, коли новий файл додається до каталогу в Linux

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

Ми збираємося написати сценарій, який спостерігає за каталогом і діє з новими файлами, які додаються. Кожен файл заархівується і переміщується в інший каталог, як тільки він буде виявлений. Сценарій використовує підсистему inotify через утиліту inotify-tools. Але спочатку давайте встановимо інструмент і поекспериментуємо.

Встановлення inotify-tools та gzip

Використовуйте apt-get, щоб встановити цей пакунок у вашу систему, якщо ви використовуєте Ubuntu або інший дистрибутив на базі Debian. В інших дистрибутивах Linux замість цього використовуйте інструмент керування пакетами свого дистрибутива Linux.

sudo apt-get install inotify-tools gzip

Експерименти з inotify-tools

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

mkdir incoming

Почніть перегляд цього каталогу, виконавши таку команду:

inotifywatch -v incoming

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

  5 найкращих торрент-клієнтів для Linux

Відкрийте нове вікно терміналу (або вкладку) і перейдіть до вхідного каталогу. Використовуйте сенсорну команду, щоб створити новий файл під назвою «новий файл».

cd incoming/
touch newfile

Тепер поверніться до першого вікна терміналу та зупиніть inotifywatch, натиснувши CTRL+C.

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

Для наших цілей нас цікавлять лише дві події:

«створити» – коли файл створюється в цільовому каталозі.
«moved_to» – коли файл переміщується з іншого місця в цільовий каталог.

Давайте спробуємо inotifywatch ще раз, але цього разу доручаємо йому відстежувати лише ці дві події. Виконайте цю команду в першому вікні терміналу:

inotifywatch -v -e create -e moved_to incoming

У другому вікні або вкладці термінала спробуємо створити новий файл, змінити його вміст, а потім перемістити файл з іншого місця в цільовий каталог. Усі ці команди запускаються з домашнього каталогу.

touch incoming/created
echo Testing123 >> incoming/created
touch /tmp/created2
mv /tmp/created2 incoming/

Поверніться до першого вікна терміналу та зупиніть inotifywatch, натиснувши CTRL+C. Ми побачимо такий результат:

  Як встановити ZFS на Linux

Зараховано лише дві події: створення файлу під назвою «created.txt» і переміщення існуючого файлу під назвою «created2.txt». Все інше, наприклад зміна «created.txt», було проігноровано.

Перегляд каталогу та виконання завдання

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

Перш ніж ми почнемо, нам потрібен каталог для зберігання файлів, які вже були оброблені. Створіть каталог під назвою «оброблено»:

mkdir processed

Далі створіть новий сценарій під назвою «watch-incoming.sh» і додайте вміст, наведений нижче:

#!/bin/bash

TARGET=~/incoming/
PROCESSED=~/processed/

inotifywait -m -e create -e moved_to --format "%f" $TARGET 
        | while read FILENAME
                do
                        echo Detected $FILENAME, moving and zipping
                        mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
                        gzip "$PROCESSED/$FILENAME"
                done

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

  Як грати в American Truck Simulator на Linux

Давайте надамо дозволи на виконання цього сценарію та запустимо його з нашого домашнього каталогу.

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

Відкрийте друге вікно терміналу та створіть новий файл у каталозі «incoming». Перелічіть вміст як «вхідного», так і «обробленого» каталогу, щоб побачити результати виявлення події:

Необроблений текстовий файл, який ми скопіювали в каталог “incoming”, був виявлений сценарієм, скопійований в “оброблений”, а потім стиснутий за допомогою gzip.

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