Cum să verificați dacă un fișier există în scripturile Linux Bash

Publicat: 2022-08-18
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Dacă un script Linux Bash se bazează pe anumite fișiere sau directoare prezente, nu poate să presupună că o fac. Trebuie să verifice dacă sunt cu siguranță prezenți. Iată cum să faci asta.

Nu presupune nimic

Când scrieți un scenariu, nu puteți face presupuneri despre ceea ce este și ce nu este prezent pe un computer. Acest lucru este de două ori adevărat dacă scriptul va fi distribuit și rulat pe mai multe computere diferite. Mai devreme sau mai târziu, scriptul va rula pe un computer care nu corespunde ipotezelor tale, iar scriptul va eșua sau va rula imprevizibil.

Tot ceea ce prețuim sau creăm pe un computer este stocat într-un fișier de un anumit format și toate aceste fișiere se află într-un director. Scripturile pot citi, scrie, redenumi, șterge și muta fișiere și directoare — toate lucrurile pe care le puteți face pe linia de comandă.

Avantajul pe care îl ai ca om este că poți vedea conținutul unui director și știi dacă un fișier există sau nu - sau chiar dacă directorul așteptat există. Dacă un script se defectează atunci când manipulează fișiere, poate avea rezultate grave și dăunătoare.

Bash oferă un set cuprinzător de teste pe care le puteți utiliza pentru a detecta fișiere și directoare și pentru a testa multe dintre atributele acestora. Încorporarea acestora în scripturi este ușoară, dar beneficiile în ceea ce privește robustețea și controlul fin sunt considerabile.

LEGATE: Cum să utilizați testele condiționate cu paranteze duble în Linux

Gama de teste

Combinând instrucțiunea if cu testul adecvat dintr-o colecție mare de teste de fișiere și directoare, putem determina cu ușurință dacă un fișier există, dacă este executabil sau inscriptibil și multe altele.

  • -b : Returnează adevărat dacă fișierul este un fișier special bloc.
  • -c : Returnează adevărat dacă fișierul are caracter special.
  • -d : Returnează adevărat dacă „fișierul” este un director.
  • -e : Returnează adevărat dacă fișierul există.
  • -f : Returnează adevărat dacă fișierul există și este un fișier obișnuit.
  • -g : Returnează adevărat dacă fișierul are setul de permisiuni setgid ( chmod g+ ).
  • -h : Returnează adevărat dacă fișierul este o legătură simbolică.
  • -L : Returnează adevărat dacă fișierul este o legătură simbolică.
  • -k : Returnează adevărat dacă are bitul lipicios setat ( chmod +t ).
  • -p : Returnează adevărat dacă fișierul este o conductă numită.
  • -r : Returnează adevărat dacă fișierul este lizibil.
  • -s : Returnează adevărat dacă fișierele există și nu sunt goale.
  • -S : Returnează adevărat dacă fișierul este un socket.
  • -t : Returnează adevărat dacă descriptorul de fișier este deschis într-un terminal.
  • -u : Returnează adevărat dacă fișierul are setul de permisiuni setuid ( chmod u+ ).
  • -w : Returnează adevărat dacă fișierul poate fi scris.
  • -x : Returnează adevărat dacă fișierul este executabil.
  • -O : Returnează adevărat dacă este deținut de dvs.
  • -G : Returnează adevărat dacă este deținut de grupul dvs.
  • -N : Returnează adevărat dacă fișierul a fost modificat de la ultima citire.
  • ! : Operatorul logic NOT.
  • && : operatorul logic AND.
  • || : Operatorul logic SAU.

Lista începe cu -b deoarece testul -a a fost depreciat și înlocuit cu testul -e .

RELATE: Cum să utilizați SUID, SGID și Sticky Bits pe Linux

Utilizarea Testelor în Scripturi

Fișierul generic testează instrucțiunea if este o construcție simplă de scripting. Comparația dintre parantezele duble ” [[ ]] ” folosește testul -f pentru a determina dacă există un fișier obișnuit cu acest nume.

Copiați textul acestui script într-un editor și salvați-l într-un fișier numit „script1.sh” și utilizați chmod pentru a-l face executabil.

 #!/bin/bash

dacă [[ -f $1 ]] 

apoi 

  echo "Fișierul $1 există." 

altfel 

  echo "Fișierul $1 nu poate fi găsit." 

fi

Trebuie să treceți numele fișierului scriptului de pe linia de comandă.

 chmod +x script1.sh 

Realizarea unui script executabil cu chmod

Va trebui să faceți acest lucru cu fiecare script dacă doriți să încercați celelalte exemple din articol.

Să încercăm scriptul pe un fișier text simplu.

 ./script1.sh test-file.txt 

Rularea script1.sh pe un fișier obișnuit

Fișierul există și scriptul raportează corect acest fapt. Dacă ștergem fișierul și încercăm din nou, testul ar trebui să eșueze, iar scriptul ar trebui să ne raporteze acest lucru.

 ./script1.sh test-file.txt 

Rularea script1.sh pe un fișier care nu există

Într-o situație reală, scenariul dvs. ar trebui să ia orice acțiune este adecvată. Poate semnalează eroarea și se oprește. Poate creează fișierul și continuă. Poate copia ceva dintr-un director de rezervă pentru a înlocui fișierul lipsă. Totul depinde de scopul scenariului. Dar cel puțin acum scriptul este capabil să ia decizia pe baza știrii dacă fișierul este prezent sau nu.

Indicatorul -f testează dacă fișierul este prezent și este un fișier „obișnuit”. Cu alte cuvinte, nu este ceva care pare a fi un fișier, dar nu este, cum ar fi un fișier de dispozitiv.

Vom folosi ls pentru a verifica dacă fișierul „/dev/random” există și apoi vom vedea ce face scriptul din el.

 ls -lh /dev/random
 ./script /dev/random 

Rularea script1.sh pe un fișier de dispozitiv

Deoarece scriptul nostru testează fișiere obișnuite și „/dev/random” este un fișier de dispozitiv, testul eșuează. Foarte des, pentru a afla dacă un fișier există, trebuie să alegeți cu atenție ce test utilizați sau trebuie să utilizați mai multe teste.

Acesta este „script2.sh”, care testează fișierele obișnuite și fișierele dispozitivului de caractere.

 #!/bin/bash

dacă [[ -f $1 ]]
apoi
  echo "Fișierul $1 există."
altfel
  echo "Fișierul $1 lipsește sau nu este un fișier obișnuit."
fi

dacă [[ -c $1 ]]
apoi
  echo "Fișierul $1 este un fișier de dispozitiv cu caractere."
altfel
  echo "Fișierul $1 lipsește sau nu este un fișier special." 
fi

Dacă rulăm acest script pe fișierul dispozitivului „/dev/random”, primul test eșuează, ceea ce ne așteptăm, iar al doilea test reușește. Recunoaște fișierul ca fișier al dispozitivului.

 ./script2.sh /dev/random 

Rularea script2.sh pe un fișier de dispozitiv de caractere

De fapt, îl recunoaște ca un fișier de dispozitiv de caractere . Unele fișiere de dispozitiv sunt fișiere de blocare a dispozitivului. Așa cum stau lucrurile, scenariul nostru nu le va face față.

 ./script2.sh /dev/sda 

Rularea scrip2.sh pe un fișier de dispozitiv bloc

Putem folosi operatorul logic OR și include un alt test în a doua instrucțiune if. De data aceasta, indiferent dacă fișierul este un fișier de dispozitiv cu caractere sau un fișier de dispozitiv bloc, testul va returna adevărat. Acesta este „script3.sh”.

 #!/bin/bash

dacă [[ -f $1 ]]
apoi
  echo "Fișierul $1 există."
altfel
  echo "Fișierul $1 lipsește sau nu este un fișier obișnuit."
fi

dacă [[ -c $1 || -b $1 ]]
apoi
  echo „Fișierul $1 este un fișier cu caractere sau dispozitiv bloc”.
altfel
  echo "Fișierul $1 lipsește sau nu este un fișier special." 
fi

Acest script recunoaște atât fișierele dispozitiv de caractere, cât și fișierele dispozitiv bloc.

 ./script3.sh /dev/random
 ./script3.sh /dev/sda 

script3.sh gestionează corect caracterele și blochează fișierele dispozitivului

Dacă este important pentru dvs. să faceți diferența între diferitele tipuri de fișiere de dispozitiv, puteți utiliza instrucțiuni imbricate if . Acesta este „script4.sh”.

 #!/bin/bash

dacă [[ -f $1 ]]
apoi
  echo "Fișierul $1 există."
altfel
  echo "Fișierul $1 lipsește sau nu este un fișier obișnuit."
fi

dacă [[ -c $1 ]]
apoi
  echo "Fișierul $1 este un fișier de dispozitiv cu caractere."
altfel
  dacă [[ -b $1 ]]
  apoi
    echo „Fișierul $1 este un fișier de dispozitiv bloc”. 
  altfel
    echo „Fișierul $1 lipsește sau nu este un fișier de dispozitiv.”
  fi
fi

Acest script recunoaște și clasifică atât fișierele dispozitivului de caractere, cât și fișierele dispozitivului bloc.

 ./script4.sh /dev/random
 ./script4.sh /dev/sda 

script8.sh identificând corect caracterul și blochează fișierele dispozitivului

Folosind operatorul logic AND putem testa mai multe caracteristici simultan. Acesta este „script5.sh”. Verifică dacă un fișier există și scriptul are permisiuni de citire și scriere pentru el.

 #!/bin/bash

dacă [[ -f $1 && -r $1 && -w $1 ]]
apoi
  echo "Fișierul $1 există și avem permisiuni de citire/scriere."
altfel
  echo "Fișierul $1 lipsește, nu este un fișier obișnuit sau nu putem citi/scrie în el."
fi

Vom rula scriptul pe un fișier care ne aparține și unul care aparține root .

 ./script5.sh .bashrc
 ./script5.sh /etc/fstab 

script5.sh verifică dacă un fișier există și dacă sunt setate permisiunile de citire și scriere

Pentru a testa existența unui director, utilizați testul -d . Acesta este „script6.sh”. Face parte dintr-un script de rezervă. Primul lucru pe care îl face este să verifice dacă directorul transmis pe linia de comandă există sau nu. Utilizează operatorul logic NOT ! în testul declarației if .

 #!/bin/bash

dacă [[ ! -d $1 ]]
apoi
  echo „Se creează un director de rezervă:” $1
  mkdir $1

  dacă [[ ! $? -eq 0 ]]
  apoi
    echo „Nu s-a putut crea directorul de rezervă:” $1
    Ieșire
  fi
altfel
  echo „Directorul de rezervă există”.
fi

# continuați cu copierea de rezervă a fișierului
echo „Se face backup la: „$1

Dacă directorul nu există, îl creează. Dacă fișierele de creare a directorului, scriptul se iese. Dacă crearea directorului reușește sau directorul există deja, scriptul continuă cu acțiunile sale de rezervă.

Vom rula scriptul și apoi vom verifica cu ls și opțiunea -d (director) dacă directorul de rezervă există.

 ./script6.sh Documente/proiect-backup
 ls -d Documente/proiect-backup 

script6.sh detectează dacă există un director

Directorul de rezervă a fost creat. Dacă rulăm din nou scriptul, ar trebui să raporteze că directorul este deja prezent.

 ./script6.sh 

script6.sh reutilizand un director existent

Scriptul găsește directorul și trece la efectuarea copiei de rezervă.

Testează, nu presupune

Mai devreme sau mai târziu, presupunerile vor duce la lucruri rele. Testați mai întâi și reacționați în consecință.

Cunoașterea este putere. Utilizați teste pentru a oferi scripturilor cunoștințele de care au nevoie.

LEGATE: Cum să permiteți scripturilor Linux să detecteze că rulează în mașinile virtuale