logo

Bash controlla se il file esiste

Nella maggior parte dei casi, potremmo trovarci in una situazione in cui potremmo dover eseguire un'azione per verificare se un file esiste o meno.

In Bash, possiamo usare un 'comando test' per verificare se un file esiste e determinare il tipo di file.

Di seguito sono riportate le sintassi del comando test e possiamo utilizzare uno qualsiasi di questi comandi:

 test expression [ expression ] [[ expression ]] 

Dobbiamo utilizzare un comando tra parentesi singola '[' per rendere il nostro script portabile per tutte le shell POSIX. La versione aggiornata del comando test contiene doppie parentesi '[[' che sono supportate sulla maggior parte dei sistemi moderni che utilizzano Bash, Zsh e Ksh come shell predefinita.

Controlla se il file esiste

Durante il controllo dell'esistenza di un file, gli operatori di file più comunemente utilizzati sono -e e -f. L'opzione '-e' viene utilizzata per verificare se un file esiste indipendentemente dal tipo, mentre l'opzione '-f' viene utilizzata per restituire il valore vero solo se il file è un file normale (non una directory o un dispositivo).

L'opzione più comune per verificare se il file esiste o meno è utilizzare il comando test con l'istruzione condizionale 'if'.

Di seguito sono riportati gli esempi per verificare se il file 'read_file.txt' esiste:

Metodo 1

 #!/bin/bash File=read_file.txt if test -f '$File'; then echo '$File exist ' fi 

Metodo 2

 #!/bin/bash File=read_file.txt if [ -f '$File' ]; then echo '$File exist ' fi 

Metodo 3

 #!/bin/bash File=read_file.txt if [[ -f '$File' ]]; then echo '$File exist ' fi 

Produzione

L'output per tutti e tre i metodi sarà il seguente perché abbiamo un file (read_file.txt) presente nella directory:

onclick js
 read_file.txt exist 

Se vogliamo eseguire un'azione che fornisca un risultato in base all'esistenza o meno del file, possiamo utilizzare il costrutto if/then nel modo seguente:

Esempio

 #!/bin/bash File=read_file.txt if [ -f '$File' ]; then echo '$File exist' else echo '$File does not exist' fi 

Produzione

 read_file.txt exist 

Possiamo anche usare il comando test senza l'istruzione if. Possiamo utilizzare uno qualsiasi dei seguenti metodi:

Metodo 1

 #!/bin/bash File=read_file.txt test -f read_file.txt && echo '$File exist' 

Metodo 2

 #!/bin/bash File=read_file.txt [ -f read_file.txt ] && echo '$File exist' 

Metodo 3

 #!/bin/bash File=read_file.txt [[ -f read_file.txt ]] && echo '$File exist' 

Produzione

L'output per tutti e tre i metodi sarà il seguente perché abbiamo un file (read_file.txt) presente nella directory:

 read_file.txt exist 

Se ci sono più comandi da eseguire dopo l'operatore &&, racchiudere i comandi tra parentesi graffe separate da punto e virgola (;) o AND (&&), ad esempio:

Esempio

 #!/bin/bash File=read_file.txt [ -f read_file.txt ] && { echo '$File exist'; echo 'Task Completed'; } 

A differenza di &&, la frase dopo || L'operatore viene eseguito solo se lo stato di uscita del comando test è 'false'.

Esempio

string.replaceall in Java
 #!/bin/bash File=read_file.txt [ -f read_file.txt ] && echo '$File exist' || echo '$File does not exist' 

Produzione

 read_file.txt exist 

Questi sono i metodi comunemente usati in Bash per verificare se il file esiste o meno.

Controlla se la directory esiste

L'operatore '-d' ci consente di verificare se un file è una directory o meno.

Di seguito sono riportati i metodi per verificare se esiste la directory 'Javatpoint':

Metodo 1

 #!/bin/bash File=Javatpoint if [ -d '$File' ]; then echo '$File is a directory' fi 

Metodo 2

 #!/bin/bash File=Javatpoint [ -d '$File' ] && echo '$File is a directory' 

Nota:Possiamo anche usare le parentesi doppie '[[' invece della parentesi singola '['.

Produzione

L'output per entrambi i metodi di cui sopra sarà il seguente poiché abbiamo una directory (denominata Javatpoint) presente nella posizione specificata:

 Javatpoint is a directory 

Controlla se il file non esiste

L'espressione di test può essere negata utilizzando il punto esclamativo (operatore NOT logico!). Dai un'occhiata al seguente esempio:

Esempio

 #!/bin/bash File=missing_read_file.txt if [ ! -f '$File' ]; then echo '$File does not exist' fi 

Lo script sopra può anche essere scritto come di seguito:

 #!/bin/bash File=missing_read_file.txt [ ! -f '$File' ] && echo '$File unavailable' 

Produzione

 missing_read_file.txt unavailable 

Operatori di test dei file

I comandi di test includono i seguenti operatori di file che ci consentono di testare particolari tipi di file:

-b Restituzioni di file 'Vero' se il FILE esiste come file speciale di blocco.
-c Resi del file 'Vero' se il FILE esiste come file di caratteri speciali.
-d Restituisce file 'Vero' se il FILE esiste come directory.
-e Restituzioni di file 'Vero' se il FILE esiste come file, indipendentemente dal tipo (nodo, directory, socket, ecc.).
-f Resi del file 'Vero' se il FILE esiste come un file normale (non una directory o un dispositivo).
-G Restituisce file 'Vero' se il FILE esiste e contiene lo stesso gruppo in cui l'utente sta eseguendo il comando.
-h Resi del file 'Vero' se il FILE esiste come collegamento simbolico.
-g Restituzioni di file 'Vero' se il FILE esiste e contiene il flag set-group-id (sgid).
-k Resi del file 'Vero' se il FILE esiste e contiene un flag di sticky bit impostato.
-L Resi del file 'Vero' se il FILE esiste come collegamento simbolico.
-O Restituzioni di file 'Vero' se il FILE esiste ed è di proprietà dell'utente che sta eseguendo il comando.
-p Restituisce file 'Vero' se il FILE esiste come pipe.
-r Restituisce il file 'Vero' se il FILE esiste come file leggibile.
-S Restituisce il file 'Vero' se il FILE esiste come socket.
-s Restituisce il file 'Vero' se il FILE esiste e ha dimensione diversa da zero.
-u Restituzioni di file 'Vero' se il FILE esiste e il flag set-user-id (suid) è impostato.
-w Restituzioni di file 'Vero' se il FILE esiste come file scrivibile.
-x Restituzioni di file 'Vero' se il FILE esiste come file eseguibile.