Jak provést úlohu, když je do adresáře v Linuxu přidán nový soubor

Tento návod vám ukáže, jak využít monitorování událostí souborového systému v Linuxu (inotify), abyste byli informováni o každém novém souboru, který se objeví ve vybrané složce. Tyto události můžete použít jako spouštěče pro automatizaci běžných úkolů ve vašem operačním systému.

Vytvoříme skript, který bude sledovat konkrétní adresář a reagovat na nově přidané soubory. Každý takový soubor bude po detekci zkomprimován a přesunut do jiného adresáře. Skript využívá subsystém inotify pomocí nástroje zvaného inotify-tools. Nejprve však tento nástroj nainstalujeme a prozkoumáme jeho možnosti.

Instalace inotify-tools a gzip

Pokud používáte Ubuntu nebo jinou distribuci založenou na Debianu, použijte k instalaci potřebných balíčků správce balíčků apt-get. V jiných distribucích Linuxu použijte odpovídající nástroj pro správu balíčků.

sudo apt-get install inotify-tools gzip

Experimentování s inotify

Začneme tím, že budeme sledovat adresář a analyzovat, jaké události jsou generovány při příchodu nových souborů. Použijeme nástroj inotifywatch, který je součástí balíčku inotify-tools. Vytvořte si novou složku s názvem „prijem“:

mkdir prijem

Nyní začněte sledovat tuto složku pomocí následujícího příkazu:

inotifywatch -v prijem

Tímto příkazem dáte inotify pokyn, aby monitoroval všechny události souborového systému v adresáři „prijem“. Volba -v zajistí, že nástroj bude vypisovat podrobnější informace o tom, co se děje. Nezadali jsme volbu časového limitu (-t), takže příkaz bude shromažďovat události, dokud ho ručně neukončíme klávesovou zkratkou CTRL+C. V tomto okamžiku by měl váš terminál vypadat přibližně takto:

Otevřete nové okno (nebo kartu) terminálu a přejděte do složky „prijem“. Pomocí příkazu touch vytvořte nový soubor s názvem „novy_soubor“.

cd prijem/
touch novy_soubor

Nyní se vraťte do prvního okna terminálu a ukončete inotifywatch pomocí CTRL+C.

V konzoli se zobrazí tabulka s událostmi, kde uvidíte jednu instanci „create“, „open“, „attrib“ a „close_write“. K těmto událostem došlo, když jsme pomocí příkazu touch vytvořili nový soubor, nastavili jeho přístupová práva, otevřeli ho pro zapsání koncového znaku a následně ho zavřeli. Toto je jen několik z mnoha událostí, které lze sledovat na souborovém systému pomocí nástrojů inotify. Úplný seznam můžete nalézt v manuálové stránce k inotifywatch.

Pro naše potřeby nás budou zajímat pouze dvě události:

  • „create“ – když je soubor vytvořen v sledovaném adresáři.
  • „moved_to“ – když je soubor přesunut z jiného umístění do sledovaného adresáře.

Zkusme inotifywatch znovu, tentokrát mu však dáme pokyn, aby sledoval pouze tyto dvě události. Spusťte tento příkaz v prvním okně terminálu:

inotifywatch -v -e create -e moved_to prijem

V druhém okně terminálu (nebo na nové záložce) zkuste vytvořit nový soubor, změnit jeho obsah a poté soubor přesunout z jiného umístění do cílové složky. Všechny příkazy spouštějte z vašeho domovského adresáře.

touch prijem/vytvoreno
echo Test123 >> prijem/vytvoreno
touch /tmp/vytvoreno2
mv /tmp/vytvoreno2 prijem/

Vraťte se do prvního okna terminálu a zastavte inotifywatch pomocí CTRL+C. Uvidíte následující výstup:

Zaznamenány byly pouze dvě události: vytvoření souboru s názvem „vytvoreno“ a přesunutí existujícího souboru s názvem „vytvoreno2“. Všechno ostatní, jako je úprava souboru „vytvoreno“, bylo ignorováno.

Sledování adresáře a provádění akcí

Nyní, když víme, jaké události chceme sledovat, můžeme použít jiný nástroj s názvem inotifywait. Ten pozastaví provádění skriptu, dokud není soubor vytvořen nebo přesunut do sledovaného adresáře. Použijeme stejné argumenty jako u inotifywatch a také určíme, jak chceme, aby byl název souboru formátován pro použití v našem skriptu.

Než začneme, potřebujeme složku pro uložení souborů, které již byly zpracovány. Vytvořte složku s názvem „zpracovano“:

mkdir zpracovano

Dále vytvořte nový skript s názvem „sleduj_prijem.sh“ a vložte do něj následující kód:

#!/bin/bash

TARGET=~/prijem/
PROCESSED=~/zpracovano/

inotifywait -m -e create -e moved_to --format "%f" $TARGET
        | while read FILENAME
                do
                        echo Detekován $FILENAME, přesouvám a komprimuji
                        mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
                        gzip "$PROCESSED/$FILENAME"
                done

Skript spustí příkaz inotifywait s volbou -m. Tím se zajistí, že příkaz bude monitorovat změny donekonečna. Pokaždé, když je detekována nová událost, je název souboru předán příkazu read a uložen do proměnné „FILENAME“. Následně se provede blok kódu v cyklu while. V něm se soubor nejprve přesune do složky „zpracovano“ a poté se zkomprimuje pomocí gzip. Původní soubor je nahrazen zkomprimovanou verzí s příponou „.gz“.

Udělejme skript spustitelným a spusťme jej z domovského adresáře:

chmod u+x sleduj_prijem.sh
./sleduj_prijem.sh

Otevřete nové okno terminálu a vytvořte nový soubor ve složce „prijem“. Vypište obsah adresářů „prijem“ i „zpracovano“, abyste viděli výsledky detekované události:

Původní textový soubor, který jsme vložili do složky „prijem“, byl detekován skriptem, přesunut do složky „zpracovano“ a poté zkomprimován pomocí gzip.

Nyní můžeme automatizovat různé zajímavé úkoly díky sledování nových souborů v adresáři. Můžeme například přidávat vodoznaky do obrázků, konvertovat videa do formátu MP4, nebo nahrávat nové soubory do cloudového úložiště, jako je Amazon S3. Tento skript je dobrým výchozím bodem pro automatizaci vašich vlastních pracovních postupů.