Domanda Come faccio a sapere se un file regolare non esiste in Bash?


Ho usato il seguente script per vedere se esiste un file:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

Qual è la sintassi corretta da usare se voglio solo verificare se il file lo fa non esistere?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi

2505
2018-03-12 14:48


origine


risposte:


Il test comando ([ qui) ha un operatore "non" logico che è il punto esclamativo (simile a molte altre lingue). Prova questo:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

3519
2018-03-12 14:50



Bash File Testing

-b filename - Blocca file speciale
-c filename - File di caratteri speciali
-d directoryname - Verifica la presenza di directory
-e filename - Verifica dell'esistenza del file, indipendentemente dal tipo (nodo, directory, socket, ecc.)
-f filename - Verifica la presenza regolare di file non una directory
-G filename - Controlla se il file esiste ed è di proprietà di un ID di gruppo effettivo
-G filename set-group-id - Vero se il file esiste ed è set-group-id
-k filename - Pezzo appiccicoso
-L filename - Collegamento simbolico
-O filename - Vero se il file esiste ed è di proprietà dell'id utente effettivo
-r filename - Controlla se il file è leggibile
-S filename - Controlla se il file è socket
-s filename - Controlla se il file è di dimensioni diverse da zero
-u filename - Controllare se il bit set-user-id è impostato
-w filename - Controlla se il file è scrivibile
-x filename - Controlla se il file è eseguibile

Come usare:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

UN Espressione di prova può essere negato usando il ! operatore

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi 

426
2018-01-16 14:25



Puoi negare un'espressione con "!":

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

La pagina man relativa è man test o, equivalentemente, man [ -- o help test o help [ per il comando bash incorporato.


250
2018-03-12 14:50



[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

Inoltre, è possibile che il file sia un collegamento simbolico non funzionante o un file non regolare, come ad es. una presa, dispositivo o fifo. Ad esempio, per aggiungere un controllo per i collegamenti simbolici non funzionanti:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi

110
2018-03-12 14:52



Vale la pena ricordare che se è necessario eseguire un singolo comando, è possibile abbreviare

if [ ! -f "$file" ]; then
    echo "$file"
fi

a

test -f "$file" || echo "$file"

o

[ -f "$file" ] || echo "$file"

80
2017-08-11 09:15



Preferisco fare il seguente one-liner, in POSIX formato compatibile con shell:

$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"

$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

Per un paio di comandi, come farei in uno script:

$  [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

Una volta che ho iniziato a farlo, raramente uso più la sintassi completamente digitata !!


56
2017-10-18 16:09



Per verificare l'esistenza del file, il parametro può essere uno dei seguenti:

-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink

Tutti i test seguenti si applicano a file, directory e collegamenti simbolici regolari:

-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0

Script di esempio:

#!/bin/bash
FILE=$1

if [ -f "$FILE" ]; then
   echo "File $FILE exists"
else
   echo "File $FILE does not exist"
fi

36
2017-12-19 12:47