Come controllare correttamente se il file esiste in Bash o Shell (con esempi)
Sommario
In questo tutorial tratterò diversi attributi che puoi usare in bash o shell scripting per controllare file e directory. Puoi utilizzare espressioni condizionali bash con ]
o utilizzare test con per verificare se il file esiste.
Lo faremo stai usando l’operatore bash if e else per tutti gli esempi, quindi ti consiglio di leggere: Bash if else guida all’uso per principianti assoluti
1. Bash / Shell: controlla se il file esiste ed è un file normale
Questa sezione mostra gli esempi per verificare se esiste un file regolare in bash.
1.1: Metodo-1: utilizzo di parentesi singole o doppie
utilizzo di parentesi doppie ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Utilizzo di parentesi singole
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Metodo 2: utilizzo del comando di prova
test
Il comando viene utilizzato per controllare i tipi di file e confrontare valori.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Metodo 3: riga singola
In questo esempio possiamo utilizzare parentesi singole o doppie. Suggerirei sempre di utilizzare le doppie parentesi quadre quando si scrive un codice di linea nella shell in quanto riduce al minimo il rischio di ricevere avvisi sulla console quando si verifica la divisione delle parole.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
L’istruzione dopo &&
verrà eseguita se SUCCESS. Se la prima condizione restituisce FALSE, verrà eseguita l’istruzione con ||
.
Allo stesso modo, utilizzando il comando test per verificare se esiste un file regolare in bash o uno script di shell in una singola riga .
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: controlla se il file esiste (è vuoto o non è vuoto)
Per controllare se il file esiste e se è vuoto o ha del contenuto, utilizziamo l’attributo “-s
”
2.1: Metodo-1: utilizzo di parentesi singole o doppie
Controlla se il file esiste e vuoto o non vuoto utilizzando le doppie parentesi graffe ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Controlla se il file esiste e vuoto o non vuoto utilizzando le doppie parentesi graffe
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Metodo 2: utilizzo del comando di prova
Utilizzando il comando di prova combiniamo l’attributo -s
per verificare se il file esiste ed è vuoto o ha del contenuto:
2.3: Metodo 3: riga singola
Possiamo usare parentesi sia doppie che singole per tale riga ma, come ho detto prima, consiglierei di usare parentesi doppie.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
Allo stesso modo con il comando di prova possiamo utilizzare &&
e ||
operatore per controllare il file nel comando a riga singola all’interno del nostro script di shell.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: controlla se la directory esiste
Spero che tu sappia che in Linux tutto è un file. Quindi, in questo modo, anche una directory è considerata un file. Possiamo utilizzare l’attributo “-d
” per verificare se esiste una directory nella programmazione della shell.
3.1: Metodo 1: utilizzo di parentesi doppie o singole
Possiamo utilizzare l’attributo -d
all’interno di o doppie parentesi graffe
]
per controllare se la directory esiste.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
Allo stesso modo in questo esempio utilizziamo singole parentesi per verificare se la directory è preimpostata nello script della shell.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Metodo 2: utilizzo del comando test
In questo esempio useremo il comando test per assicurarci che la directory sia presente o meno prima di eseguire determinate attività.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Metodo 3: riga singola
In questo esempio useremo parentesi singole e doppie in formato riga singola per controllare per la directory. L’istruzione dopo l’operatore &&
verrà eseguita se la prima condizione è TRUE e se è FALSE verrà eseguita l’istruzione ||
condition ” .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Suggerirei di utilizzare ]
invece di per tali codici lineari nella programmazione della shell.
Allo stesso modo con &&
e ||
possiamo usare il comando test per controllare se la directory esiste
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: controlla se la directory esiste (vuota o non vuota)
Non ci sono attributi di shell come ho usato in tutti gli altri esempi e scenari in questo tutorial, ma abbiamo alcuni hack che possiamo usare per controllare se la directory è vuota o non vuota.
4.1: Metodo-1: Elenca il contenuto della directory e verifica
In questo esempio elencheremo il contenuto della directory, sopprimeremo l’output e quindi, in base al codice di uscita, controlliamo se la directory è vuota o ne contiene contenuto
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
Possiamo anche invertire questa situazione inserendo una condizione NOT (!
). Quindi sarebbe simile a:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
L’output sarebbe lo stesso in entrambi gli script di esempio.
4.2: Metodo 2: utilizzo comando find
Possiamo usare il comando find e quindi sopprimere l’output per verificare se la directory di destinazione ha del contenuto o meno.
#!/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: Metodo 3: Elenca il contenuto
Ancora come ho detto poiché non esiste un modo semplice per verificare se una directory è vuota o non utilizza alcuni attributi, elencheremo il contenuto della directory. Se non ottieni alcun output, la directory è vuota oppure non è vuota
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: elenco di attributi per il file di test
Allo stesso modo ci sono molti altri attributi che puoi usare con gli script della shell per controllare diversi tipi di file, come collegamenti simbolici, permessi dei file ecc.
Attributi | Che cosa fa? |
---|---|
-a FILE |
Vero se FILE esiste |
-b FILE |
Vero se FILE esiste ed è un file speciale a blocchi. |
-c FILE |
True if FILE esiste ed è un file speciale di caratteri. |
-d FILE |
Vero se FILE esiste ed è una directory. |
Vero se FILE esiste |
|
-f FILE |
Vero se FILE esiste ed è un file normale |
-g FILE |
Vero se FILE esiste e il relativo bit set-group-id è impostato |
-h FILE |
Vero se FILE esiste ed è un collegamento simbolico |
-k FILE |
Vero se FILE esiste e il relativo bit “appiccicoso” è impostato |
-p FILE |
Vero se FILE esiste ed è un named pipe (FIFO) |
-r FILE |
True if FILE esiste ed è leggibile |
-s FILE |
Vero se FILE esiste e ha una dimensione maggiore di zero |
-u FILE |
Vero se FILE esiste e il relativo bit set-user-id è impostato |
-w FILE |
Vero se FILE esiste ed è scrivibile |
-x FILE |
Vero se FILE esiste ed è eseguibile |
-G FILE |
Vero se FILE esiste ed è di proprietà dell’ID gruppo effettivo |
-L FILE |
Vero se FILE esiste ed è un collegamento simbolico |
-N FILE |
Vero se FILE esiste ed è stato modificato dall’ultima lettura |
-o FILE |
Vero se FILE esiste ed è di proprietà dell’effettivo ID utente |
-S FILE |
Vero se FILE esiste ed è un socket |
|
Vero se FILE1 e FILE2 si riferiscono allo stesso dispositivo e numeri di inode |
FILE1 -nt FILE2 |
Vero se FILE1 è più recente (in base alla data di modifica) di FILE2 , o se FILE1 esiste e FILE2 sì non |
FILE1 -ot FILE2 |
Vero se FILE1 è precedente di FILE2 o se FILE2 esiste e FILE1 no |