Sådan udføres en opgave, når en ny fil føjes til en mappe i Linux

Denne vejledning viser dig, hvordan du bruger Linux-filsystemhændelser (besked) til at få besked, hver gang en fil vises i en mappe. Du kan bruge disse som triggere til at automatisere almindelige opgaver på dit system.

Vi kommer til at skrive et script, der overvåger en mappe og handler på nye filer, der tilføjes. Hver fil bliver gzippet og flyttet til en anden mappe, så snart den er opdaget. Scriptet bruger inotify-undersystemet gennem et hjælpeprogram kaldet inotify-tools. Men lad os først installere værktøjet og eksperimentere.

Installation af inotify-tools og gzip

Brug apt-get til at installere denne pakke på dit system, hvis du bruger Ubuntu eller en anden Debian-baseret distribution. På andre Linux-distributioner skal du bruge din Linux-distributions pakkehåndteringsværktøj i stedet.

sudo apt-get install inotify-tools gzip

Eksperimenterer med inotify-værktøjer

Lad os begynde med at se en mappe og se, hvilke begivenheder der starter, når der kommer nye filer. Vi vil bruge et værktøj kaldet inotifywatch , som er en del af inotify-tools. Opret en ny mappe kaldet “indkommende”:

mkdir incoming

Begynd at se denne mappe ved at udføre følgende kommando:

inotifywatch -v incoming

Dette instruerer inotify om at holde øje med alle filsystemhændelser i mappen “indkommende”. Valgmuligheden -v får værktøjet til at udskrive ekstra information om, hvad det laver. Vi har ikke angivet en timeout-indstilling (-t ), og kommandoen vil blive ved med at samle hændelser, indtil vi afslutter med CTRL+C. På dette tidspunkt skulle vores terminal se sådan ud:

  7 gode Linux-app-alternativer til Windows-apps

Åbn et nyt terminalvindue (eller fane) og skift til det indgående bibliotek. Brug berøringskommandoen til at oprette en ny fil med navnet “nyfil”.

cd incoming/
touch newfile

Gå nu tilbage til det første terminalvindue og stop inotifywatch ved at trykke CTRL+C.

En tabel med begivenheder vil blive serveret til konsollen, der angiver en forekomst af “create”, “open”, “attrib” og “close_write.” Disse fire hændelser opstod, da vi brugte berøring til at oprette en ny fil, indstillede dens filadgangsattributter, åbnede den for at skrive et null-terminerende tegn og derefter lukkede den bagefter. Dette er blot nogle få af de mange begivenheder, der kan overvåges på et filsystem med inotify-værktøjer. Du kan se hele listen på hovedsiden for inotifywatch.

Til vores formål er vi kun interesseret i to arrangementer:

“create” – når en fil oprettes i målmappen.
“moved_to” – når en fil flyttes fra en anden placering til målmappen.

Lad os prøve inotifywatch igen, men denne gang instruerer vi det om kun at overvåge disse to begivenheder. Kør denne kommando i det første terminalvindue:

inotifywatch -v -e create -e moved_to incoming

I det andet terminalvindue eller -faneblad, lad os prøve at oprette en ny fil, ændre dens indhold og derefter flytte filen fra en anden placering til målmappen. Alle disse kommandoer køres fra hjemmebiblioteket.

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

Gå tilbage til det første terminalvindue og stop inotifywatch ved at trykke på CTRL+C. Vi vil se følgende output:

  Sådan bruger du journalctl til at læse Linux-systemlogfiler

Kun to hændelser blev talt: oprettelse af en fil kaldet “created.txt” og flytning af en eksisterende fil kaldet “created2.txt”. Alt andet, såsom ændring af “created.txt”, blev ignoreret.

Se en mappe og udføre en opgave

Nu hvor vi ved, hvilke begivenheder vi skal følge, kan vi bruge et andet værktøj kaldet inotifywait til at blokere udførelse, indtil en fil er oprettet i eller flyttet til vores målmappe. Vi bruger de samme argumenter, som vi gjorde med inotifywatch og specificerer også, hvordan vi ønsker, at filnavnet skal formateres til brug i vores opgave.

Før vi begynder, har vi brug for en mappe til at indeholde filer, der allerede er blevet behandlet. Opret en mappe kaldet “behandlet”:

mkdir processed

Derefter skal du oprette et nyt script kaldet “watch-incoming.sh” og tilføje indholdet nedenfor:

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

Scriptet udfører kommandoen inotifywait med muligheden -m. Dette gør, at kommandomonitoren ændres på ubestemt tid. Hver gang en ny hændelse detekteres, overføres filnavnet til read-kommandoen og injiceres i variablen “FILENAME”. Blokken under while-løkken udføres, hvor filen først flyttes til den “behandlede” mappe og derefter gzippes. Den originale fil erstattes med den komprimerede fil, og filnavnet ender med “.gz”.

  Sådan bruges VLC med Chromecast på Linux

Lad os give udførelsestilladelser til dette script og køre det fra vores hjemmemappe.

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

Åbn det andet terminalvindue og opret en ny fil i mappen “indgående”. List indholdet af både “indgående” og “behandlet” bibliotek for at se resultaterne af den hændelse, der registreres:

Den rå tekstfil, som vi kopierede ind i mappen “indkommende” blev opdaget af scriptet, kopieret til “behandlet” og derefter komprimeret ved hjælp af gzip.

Vi kan udføre nogle interessante opgaver nu, hvor vi er i stand til at holde øje med nye filer, der ankommer i en mappe. For eksempel kunne vi tilføje et vandmærke til billedfiler, komprimere råvideoer til mp4-format og endda uploade hver ny fil, vi ser, til en Amazon S3-bøtte. Dette script er et godt udgangspunkt for at rulle dine egne arbejdsgange og automatisere almindelige opgaver på dit system.