Hur du Utför en Uppgift När en Ny Fil Läggs till en Katalog i Linux

0
287
Fatmawati Achmad Zaenuri/Shutterstock.kom

Denna handledning kommer att visa dig hur man använder Linux filsystem händelser (meddela) för att få ett meddelande varje gång en fil visas i en katalog. Du kan använda dessa som triggers för att automatisera vanliga uppgifter på ditt system.

Vi kommer att skriva ett skript som kollar på en katalog och agerar på nya filer som har lagts till. Varje fil är gzip och flyttade till en annan katalog, så snart det upptäcks. Skriptet använder inotify delsystem, genom ett verktyg som heter inotify-verktyg. Men först, låt oss installera verktyget och experiment.

Installera inotify-verktyg och gzip

För att använda apt-get för att installera detta paket på ditt system om du använder Ubuntu eller annan Debian-baserad distribution. På andra Linux-distributioner, använda din Linux-distribution är pakethanteringsverktyget istället.

sudo apt-get install inotify-verktyg gzip

Experimentera med inotify-verktyg

Låt oss börja med att titta på en katalog och se vad som händer inleda när nya filer anländer. Vi kommer att använda ett verktyg som heter inotifywatch , som är en del av inotify-verktyg. Skapa en ny katalog som heter “inkommande”:

mkdir inkommande

Börja titta på denna katalog, genom att köra följande kommando:

inotifywatch -v inkommande

Detta kommer att instruera inotify att titta på för alla filsystem händelserna i “inkommande” katalogen. Alternativet-v gör verktyget skriva ut extra information om vad det gör. Vi har inte angett en timeout-alternativet (- t ), och kommandot kommer att hålla samla händelser tills vi avsluta med CTRL+C. Vid denna punkt, vår terminal bör se ut ungefär så här:

Öppna nytt terminal-fönster (eller flik) och ändra till incoming-katalogen. Använd kommandot touch för att skapa en ny fil med namnet “newfile.”

cd-inkommande/
touch newfile

Gå nu tillbaka till första terminal-fönstret och sluta inotifywatch genom att trycka på CTRL+C.

En tabell av händelser som kommer att serveras till konsolen, vilket indikerar ett exempel på “skapa”, “öppna” “attrib,” och “close_write.” Dessa fyra händelser inträffat när vi använt tryck för att skapa en ny fil, ställa in sin fil tillgång attribut, öppnade det för att skriva ett null avslutande karaktär, och sedan avslutades det efteråt. Dessa är bara några av de många händelser som kan övervakas på ett filsystem med inotify-verktyg. Du kan se hela listan på startsidan för inotifywatch.

För våra syften är vi bara intresserade av två händelser:

  • “skapa” – när en fil skapas i target-katalog.
  • “moved_to” – när du flyttar en fil från en annan plats i target-katalog.

Låt oss försöka inotifywatch igen, men den här gången staten åläggs att övervaka dessa två händelser. Kör detta kommando i terminal-fönstret:

inotifywatch -v -e-skapa -e moved_to inkommande

I den andra terminalen fönster eller flik, låt oss försöka skapa en ny fil, ändra dess innehåll, och sedan flytta filen från en annan plats till target-katalog. Alla dessa kommandon körs från hemkatalogen.

tryck inkommande/skapad
echo Testing123 >> inkommande/skapad
tryck på /tmp/created2
mv /tmp/created2 inkommande/

Gå tillbaka till första terminal-fönstret och sluta inotifywatch genom att trycka på CTRL+C. Vi kommer att se följande resultat:

Bara två händelser var som räknas: att skapa en fil som heter “created.txt” och flytta en befintlig fil som heter “created2.txt”. Allt annat, såsom att ändra “created.txt” var ignoreras.

Titta på en Katalog och genomförande av en Uppgift

Nu när vi vet vilka händelser att följa, kan vi använda ett annat verktyg som heter inotifywait att blockera körning till en fil som har skapats i eller flyttas till våra target-katalog. Vi använder samma argument som vi gjorde med inotifywatch och också ange hur vi vill ha det filnamn som ska formateras för att använda i vår uppgift.

Innan vi börjar behöver vi en katalog för att hålla filer som redan har behandlats. Skapa en katalog som heter “behandlas”:

mkdir behandlas

Nästa, skapa en ny skript som heter “watch-incoming.sh” och lägg till det innehåll som anges nedan:

#!/bin/bash

TARGET=~/incoming/
BEARBETADE=~/behandlat/

inotifywait -m -e-skapa -e moved_to –formatet “%f” $TARGET
| medan att läsa FILNAMN
göra
echo Upptäckts $FILENAME, flytta och zippa
mv “$MÅL/$FILENAME” “$BEARBETADE/$FILENAME”
gzip “$BEARBETADE/$FILENAME”
gjort

Skriptet utför inotifywait kommandot med alternativet-m. Detta gör kommandot övervaka förändringar på obestämd tid. Varje gång en ny händelse upptäcks, filnamn överförs till läs-kommandot och injiceras i “FILNAMN” variabel. Blocket under while-loopen exekveras, där filen är först flyttade till de “behandlas” katalog, och sedan gzip. Den ursprungliga filen ersätts med komprimerade filen, filnamnet ska sluta på “.gz”.

Låt oss ge exekvera rättigheter på detta skript och köra det från vår hemkatalog.

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

Öppna den andra terminalfönster och skapa en ny fil i den “inkommande” katalogen. Lista innehållet i såväl den “inkommande” och “bearbetade” katalog för att se resultaten av händelsen att bli upptäckt:

Den råa textfil som vi kopierade till den “inkommande” – katalogen upptäcktes av manus, kopieras till “behandlas” och sedan komprimerade med gzip.

Vi kan göra en del intressanta uppgifter nu att vi kan titta på för nya filer som anländer i en katalog. Vi skulle till exempel kunna lägga till en vattenstämpel på bilden filer, komprimera rå videor i mp4-format och även ladda upp varje ny fil ser vi till Amazon S3 bucket. Detta skript är en bra utgångspunkt för rullande egna arbetsflöden och automatisera vanliga uppgifter på ditt system.