Hvordan utføre en oppgave når en ny fil er lagt til en katalog i Linux

Denne opplæringen vil vise deg hvordan du bruker Linux-filsystemhendelser (varsle) for å bli varslet hver gang en fil vises i en katalog. Du kan bruke disse som utløsere for å automatisere vanlige oppgaver på systemet ditt.

Vi skal skrive et skript som overvåker en katalog og handler på nye filer som legges til. Hver fil blir gzippet og flyttet til en annen katalog så snart den oppdages. Skriptet bruker inotify-delsystemet, gjennom et verktøy kalt inotify-tools. Men først, la oss installere verktøyet og eksperimentere.

Installerer inotify-tools og gzip

Bruk apt-get for å installere denne pakken på systemet ditt hvis du bruker Ubuntu eller en annen Debian-basert distribusjon. På andre Linux-distribusjoner, bruk Linux-distribusjonens pakkehåndteringsverktøy i stedet.

sudo apt-get install inotify-tools gzip

Eksperimenterer med inotify-verktøy

La oss begynne med å se på en katalog og se hvilke hendelser som starter når nye filer kommer. Vi skal bruke et verktøy som heter inotifywatch , som er en del av inotify-tools. Opprett en ny katalog kalt «innkommende»:

mkdir incoming

Begynn å se på denne katalogen ved å utføre følgende kommando:

inotifywatch -v incoming

Dette vil be inotify om å se etter alle filsystemhendelser i «innkommende» katalogen. Alternativet -v gjør at verktøyet skriver ut ekstra informasjon om hva det gjør. Vi har ikke spesifisert et tidsavbruddsalternativ (-t ), og kommandoen vil fortsette å samle hendelser til vi avslutter med CTRL+C. På dette tidspunktet skal terminalen vår se omtrent slik ut:

  Hvordan spille Yooka-Laylee på Linux

Åpne et nytt terminalvindu (eller fane) og bytt til innkommende katalog. Bruk berøringskommandoen for å lage en ny fil med navnet «newfile.»

cd incoming/
touch newfile

Gå nå tilbake til det første terminalvinduet og stopp inotifywatch ved å trykke CTRL+C.

En tabell med hendelser vil bli servert til konsollen, som indikerer en forekomst av «opprett», «åpne», «attrib» og «lukk_skriv». Disse fire hendelsene skjedde da vi brukte berøring for å lage en ny fil, satte dens filtilgangsattributter, åpnet den for å skrive et null-avsluttende tegn og lukket den etterpå. Dette er bare noen av de mange hendelsene som kan overvåkes på et filsystem med inotify-verktøy. Du kan se hele listen på hovedsiden for inotifywatch.

For våre formål er vi kun interessert i to arrangementer:

«skape» – når en fil opprettes i målkatalogen.
«moved_to» – når en fil flyttes fra et annet sted til målkatalogen.

La oss prøve inotifywatch igjen, men denne gangen ber vi den om å bare overvåke disse to hendelsene. Kjør denne kommandoen i det første terminalvinduet:

inotifywatch -v -e create -e moved_to incoming

I det andre terminalvinduet eller -fanen, la oss prøve å lage en ny fil, endre innholdet og deretter flytte filen fra et annet sted til målkatalogen. Alle disse kommandoene kjøres fra hjemmekatalogen.

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

Gå tilbake til det første terminalvinduet og stopp inotifywatch ved å trykke CTRL+C. Vi vil se følgende utgang:

  Hvordan installere JetBrains Rider på Linux

Bare to hendelser ble talt: opprette en fil kalt «created.txt» og flytte en eksisterende fil kalt «created2.txt». Alt annet, som å endre «created.txt», ble ignorert.

Se på en katalog og utføre en oppgave

Nå som vi vet hvilke hendelser vi skal følge, kan vi bruke et annet verktøy kalt inotifywait for å blokkere kjøring til en fil er opprettet i eller flyttet til målkatalogen vår. Vi bruker de samme argumentene som vi gjorde med inotifywatch og spesifiserer også hvordan vi vil at filnavnet skal formateres for bruk i oppgaven vår.

Før vi begynner, trenger vi en katalog for å inneholde filer som allerede er behandlet. Opprett en katalog kalt «behandlet»:

mkdir processed

Deretter oppretter du et nytt skript kalt «watch-incoming.sh» og legger til innholdet som er oppført 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

Skriptet utfører inotifywait-kommandoen med alternativet -m. Dette gjør at kommandomonitoren endres på ubestemt tid. Hver gang en ny hendelse oppdages, sendes filnavnet til read-kommandoen og injiseres i «FILENAME»-variabelen. Blokken under while-løkken kjøres, hvor filen først flyttes til den «behandlede» katalogen og deretter gzippes. Den opprinnelige filen erstattes med den komprimerte filen, og filnavnet vil ende på «.gz».

  Hvordan installere Gnome 40 på Linux tidlig

La oss gi utføringstillatelser på dette skriptet og kjøre det fra hjemmekatalogen vår.

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

Åpne det andre terminalvinduet og lag en ny fil i «innkommende» katalogen. List innholdet i både «innkommende» og «behandlet» katalogen for å se resultatene av hendelsen som oppdages:

Råtekstfilen som vi kopierte til «innkommende»-katalogen ble oppdaget av skriptet, kopiert til «behandlet» og deretter komprimert ved hjelp av gzip.

Vi kan gjøre noen interessante oppgaver nå som vi kan se etter nye filer som kommer inn i en katalog. For eksempel kan vi legge til et vannmerke til bildefiler, komprimere råvideoer til mp4-format og til og med laste opp hver nye fil vi ser til en Amazon S3-bøtte. Dette skriptet er et godt utgangspunkt for å rulle dine egne arbeidsflyter og automatisere vanlige oppgaver på systemet ditt.