Cum se verifică corect dacă fișierul există în Bash sau Shell (cu exemple)
Cuprins
În acest tutorial voi acoperi diferite atribute pe care le puteți utiliza în scripturile bash sau shell pentru a verifica fișierele și directoarele. Puteți utiliza expresii condiționale bash cu ]
sau puteți utiliza testul cu pentru a verifica dacă fișierul există.
folosiți operatorul bash if și else pentru toate exemplele, așa că v-aș recomanda să citiți: Bash if else ghid de utilizare pentru începători absolut
1. Bash / Shell: Verificați dacă fișierul există și este un fișier obișnuit
Această secțiune arată exemplele pentru a verifica dacă există fișier obișnuit în bash.
1.1: Metoda-1: Utilizarea parantezelor simple sau duble
Utilizarea parantezelor duble ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Utilizarea parantezelor simple
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Metoda-2: Utilizarea comenzii de testare
test
Comanda este utilizată pentru a verifica tipurile de fișiere și a compara valori.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Metoda-3: Linie simplă
Aici putem folosi paranteze simple sau duble în acest exemplu. Aș recomanda să utilizați întotdeauna paranteze duble atunci când scrieți un cod de linie în shell, deoarece minimizează riscul de a primi avertismente pe consolă atunci când are loc divizarea cuvintelor.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
Instrucțiunea după &&
va fi executată dacă SUCCES. Dacă prima condiție returnează FALS, atunci va fi executată declarația cu ||
.
În mod similar, folosind comanda test pentru a verifica dacă există fișier obișnuit în script bash sau shell într-o singură linie .
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Verificați dacă fișierul există (este gol sau nu)
Pentru a verifica dacă fișierul există și dacă este gol sau dacă are un conținut, atunci folosim atributul „-s
”
2.1: Metoda-1: Utilizarea parantezelor simple sau duble
Verificați dacă fișierul există și gol sau nu, utilizând paranteze duble ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Verificați dacă fișierul există și gol sau nu gol folosind paranteze duble
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Metoda-2: Folosind comanda test
Folosind comanda test combinăm atributul -s
pentru a verifica dacă fișierul există și este gol sau are un conținut:
2.3: Metoda-3: linie simplă
Putem folosi ambele paranteze duble sau simple pentru o astfel de linie, dar așa cum am spus mai devreme, aș recomanda utilizarea parantezelor duble. / p>
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
În mod similar, cu comanda de testare putem folosi &&
și ||
operator pentru a verifica fișierul într-o singură linie de comandă din scriptul nostru shell.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: Verificați dacă există director
Sper să știți că în Linux totul este un fișier. Deci, în acest fel, un director este, de asemenea, considerat a fi un fișier. Putem utiliza atributul „-d
” pentru a verifica dacă există un director în programarea shell.
3.1: Metoda-1: Utilizarea parantezelor duble sau simple
Putem utiliza atributul -d
în cadrul sau paranteze duble
]
pentru a verifica dacă directorul există.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
În mod similar, folosim paranteze simple în acest exemplu pentru a verifica dacă directorul este presetat în scriptul shell.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Metoda-2: Utilizarea comenzii test
În acest exemplu vom folosi comanda test pentru a ne asigura dacă directorul este prezent sau nu înainte de a efectua anumite sarcini.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Metoda-3: Linie simplă
În acest exemplu vom folosi paranteze simple și duble sub formă de linie simplă pentru a verifica pentru director. Instrucțiunea după operatorul &&
va fi executată dacă prima condiție este ADEVĂRATĂ și dacă este FALSĂ instrucțiunea ||
va fi executată .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Aș recomanda utilizarea ]
în loc de pentru astfel de coduri de linie în programarea shell.
În mod similar cu &&
și ||
putem folosi comanda test pentru a verifica dacă directorul există
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Verificați dacă directorul există (gol sau nu gol)
Nu există atribute shell așa cum am folosit în toate celelalte exemple și scenarii din acest tutorial. Dar avem unele hacks pe care le putem folosi pentru a verifica dacă directorul este gol sau nu – gol.
4.1: Metoda-1: Enumerați conținutul directorului și verificați
În acest exemplu vom lista conținutul directorului, vom suprima ieșirea și apoi pe baza codului de ieșire vom verifica dacă directorul este gol sau conține unele content
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
De asemenea, putem inversa acest lucru punând o condiție NU (!
). Deci ar arăta ca:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
Rezultatul ar fi același în ambele scripturi de exemplu.
4.2: Metoda-2: Utilizarea comanda find
Putem folosi comanda find și apoi suprimăm ieșirea pentru a verifica dacă directorul țintă are sau nu conținut.
#!/bin/bashDIR="/tmp"if find -- "$DIR" -prune -type d -empty | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
4.3: Metoda-3: Enumerați conținutul
Din nou, așa cum am spus, deoarece nu există o modalitate ușoară de a verifica dacă un director este gol sau nu utilizează unele atribute, vom lista conținutul directorului. Dacă nu obțineți nicio ieșire, directorul este gol sau altfel nu este gol
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Lista atributelor pentru fișierul de testare
În mod similar, există mai multe atribute pe care le puteți utiliza cu scripturile shell pentru a verifica diferitele tipuri de fișiere, cum ar fi legături simbolice, permisiuni de fișiere etc.
Atribute | Ce face? |
---|---|
-a FILE |
Adevărat dacă FILE există |
-b FILE |
Adevărat dacă FILE există și este un fișier special de bloc. |
-c FILE |
Adevărat dacă FILE există și este un fișier special pentru caractere. |
-d FILE |
Adevărat dacă FILE există și este un director. |
Adevărat dacă există FILE |
|
-f FILE |
Adevărat dacă există FILE și este un fișier obișnuit |
-g FILE |
Adevărat dacă există FILE și bitul său set-group-id este setat |
-h FILE |
Adevărat dacă FILE există și este o legătură simbolică |
-k FILE |
Adevărat dacă există FILE și bitul său „lipicios” este setat |
-p FILE |
Adevărat dacă FILE există și este pipe denumit (FIFO) |
-r FILE |
Adevărat dacă FILE există și este lizibil |
-s FILE |
Adevărat dacă FILE există și are o dimensiune mai mare decât zero |
-u FILE |
Adevărat dacă există FILE și bitul său set-user-id este setat |
-w FILE |
Adevărat dacă FILE există și este scriibil |
-x FILE |
Adevărat dacă FILE există și este executabil |
-G FILE |
Adevărat dacă FILE există și este deținut de ID-ul grupului efectiv |
-L FILE |
Adevărat dacă există FILE și este o legătură simbolică |
-N FILE |
Adevărat dacă FILE există și a fost modificat de la ultima lectură |
-o FILE |
Adevărat dacă FILE există și este deținut de efectiv ID utilizator |
-S FILE |
Adevărat dacă există FILE și este un socket |
|
Adevărat dacă FILE1 și FILE2 se referă la același dispozitiv și numere inode |
FILE1 -nt FILE2 |
Adevărat dacă FILE1 este mai nou (conform datei modificării) decât FILE2 sau dacă există FILE1 și există FILE2 nu |
FILE1 -ot FILE2 |
Adevărat dacă FILE1 este mai vechi decât FILE2 sau dacă există FILE2 și FILE1 nu |