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

Tento tutoriál vám ukáže, jak používat události souborového systému Linux (notify), abyste byli upozorněni pokaždé, když se soubor objeví v adresáři. Můžete je použít jako spouštěče k automatizaci běžných úloh ve vašem systému.

Chystáme se napsat skript, který sleduje adresář a pracuje s novými soubory, které jsou přidány. Každý soubor je zazipován a přesunut do jiného adresáře, jakmile je detekován. Skript používá subsystém inotify prostřednictvím nástroje nazvaného inotify-tools. Nejprve však nainstalujme nástroj a experimentujeme.

Instalace nástrojů inotify-tools a gzip

Pokud používáte Ubuntu nebo jinou distribuci založenou na Debianu, použijte apt-get k instalaci tohoto balíčku do vašeho systému. V jiných distribucích Linuxu použijte místo toho nástroj pro správu balíčků vaší distribuce Linuxu.

sudo apt-get install inotify-tools gzip

Experimentování s nástroji inotify

Začněme sledováním adresáře a sledováním toho, jaké události spouštějí, když dorazí nové soubory. Použijeme nástroj s názvem inotifywatch , který je součástí inotify-tools. Vytvořte nový adresář s názvem „příchozí“:

mkdir incoming

Začněte sledovat tento adresář provedením následujícího příkazu:

inotifywatch -v incoming

To dá inotify pokyn, aby sledovala všechny události souborového systému v adresáři „incoming“. Volba -v způsobí, že nástroj vytiskne další informace o tom, co dělá. Nezadali jsme volbu časového limitu (-t) a příkaz bude shromažďovat události, dokud neukončíme pomocí CTRL+C. V tuto chvíli by náš terminál měl vypadat nějak takto:

  Microsoft Edge získává postranní panel pro vyhledávání na webu

Otevřete nové okno terminálu (nebo kartu) a přejděte do adresáře příchozí pošty. Pomocí dotykového příkazu vytvořte nový soubor s názvem „newfile“.

cd incoming/
touch newfile

Nyní se vraťte do prvního okna terminálu a zastavte inotifywatch stisknutím CTRL+C.

Do konzole bude doručena tabulka událostí s uvedením jedné instance „create“, „open“, „attrib“ a „close_write“. K těmto čtyřem událostem došlo, když jsme pomocí dotyku vytvořili nový soubor, nastavili jeho atributy přístupu k souboru, otevřeli jej pro zapsání nulového ukončovacího znaku a poté jej zavřeli. Toto je jen několik z mnoha událostí, které lze monitorovat na souborovém systému pomocí nástrojů inotify. Úplný seznam můžete vidět na hlavní stránce inotifywatch.

Pro naše účely nás zajímají pouze dvě události:

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

Zkusme znovu inotifywatch, ale tentokrát mu 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 incoming

V druhém okně terminálu nebo záložce zkusme vytvořit nový soubor, změnit jeho obsah a poté soubor přesunout z jiného umístění do cílového adresáře. Všechny tyto příkazy se spouštějí z domovského adresáře.

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

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

  Jak vytvořit složky aplikací v prostředí Gnome

Byly započítány pouze dvě události: vytvoření souboru s názvem „created.txt“ a přesun existujícího souboru s názvem „created2.txt“. Všechno ostatní, jako je úprava souboru „created.txt“, bylo ignorováno.

Sledování adresáře a provádění úkolu

Nyní, když víme, jaké události máme sledovat, můžeme použít jiný nástroj nazvaný inotifywait k zablokování provádění, dokud není soubor vytvořen nebo přesunut do našeho cílové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ší úloze.

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

mkdir processed

Dále vytvořte nový skript s názvem „watch-incoming.sh“ a přidejte obsah uvedený níže:

#!/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

Skript provede příkaz inotifywait s volbou -m. To způsobí, že se příkazový monitor změní donekonečna. Pokaždé, když je detekována nová událost, je název souboru předán příkazu read a vložen do proměnné „FILENAME“. Provede se blok v cyklu while, ve kterém se soubor nejprve přesune do adresáře „processed“ a poté se zazipuje. Původní soubor je nahrazen komprimovaným souborem a název souboru bude končit „.gz“.

  Jak nastavit formulář výdajů v aplikaci Microsoft Word

Pojďme tomuto skriptu udělit oprávnění ke spuštění a spustit jej z našeho domovského adresáře.

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

Otevřete druhé okno terminálu a vytvořte nový soubor v adresáři „příchozí“. Vypište obsah adresáře „příchozí“ i „zpracované“, abyste viděli výsledky detekované události:

Nezpracovaný textový soubor, který jsme zkopírovali do adresáře „incoming“, byl detekován skriptem, zkopírován do „processed“ a poté komprimován pomocí gzip.

Nyní můžeme dělat zajímavé úkoly, když jsme schopni sledovat, zda do adresáře přicházejí nové soubory. Například bychom mohli přidat vodoznak do obrazových souborů, komprimovat nezpracovaná videa do formátu mp4 a dokonce nahrát každý nový soubor, který vidíme, do kbelíku Amazon S3. Tento skript je dobrým výchozím bodem pro zavádění vašich vlastních pracovních postupů a automatizaci běžných úloh ve vašem systému.