Pregunta ¿Cómo puedo saber si un archivo regular no existe en Bash?


He utilizado la siguiente secuencia de comandos para ver si existe un archivo:

#!/bin/bash

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

¿Cuál es la sintaxis correcta para usar si solo quiero verificar si el archivo no ¿existe?

#!/bin/bash

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

2507
2018-03-12 14:48


origen


Respuestas:


los prueba comando ([ aquí) tiene un operador lógico "no" que es el signo de exclamación (similar a muchos otros idiomas). Prueba esto:

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

3520
2018-03-12 14:50



Bash File Testing

-b filename - Bloquear archivo especial
-c filename - Archivo de caracteres especiales
-d directoryname - Verifique la existencia del directorio
-e filename - Compruebe la existencia del archivo, independientemente del tipo (nodo, directorio, socket, etc.)
-f filename - Verifique la existencia regular de archivos, no un directorio
-G filename - Verifique si el archivo existe y es propiedad de una identificación de grupo efectiva
-G filename set-group-id - Verdadero si el archivo existe y es set-group-id
-k filename - Sticky bit
-L filename - Enlace simbólico
-O filename - Verdadero si el archivo existe y es propiedad de la identificación de usuario efectiva
-r filename - Verifica si el archivo es legible
-S filename - Verifica si el archivo es socket
-s filename - Verifique si el archivo tiene un tamaño distinto de cero
-u filename - Comprobar si el archivo set-user-id bit está configurado
-w filename - Verificar si el archivo es escribible
-x filename - Verificar si el archivo es ejecutable

Cómo utilizar:

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

UN expresión de prueba puede ser negado usando el ! operador

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

427
2018-01-16 14:25



Puedes negar una expresión con "!":

#!/bin/bash
FILE=$1

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

La página del manual relevante es man test o equivalente, man [ - o help test o help [ para el comando bash incorporado.


250
2018-03-12 14:50



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

Además, es posible que el archivo sea un enlace simbólico roto o un archivo no regular, como p. un zócalo, dispositivo o fifo. Por ejemplo, para agregar un cheque para enlaces simbólicos rotos:

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 mencionar que si necesita ejecutar un solo comando puede abreviar

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

a

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

o

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

80
2017-08-11 09:15



Prefiero hacer el siguiente one-liner, en POSIX formato compatible con el shell:

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

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

Para un par de comandos, como lo haría en un script:

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

¡Una vez que comencé a hacer esto, raramente uso la sintaxis completamente tipada más !!


56
2017-10-18 16:09



Para probar la existencia del archivo, el parámetro puede ser cualquiera de los siguientes:

-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

Todas las pruebas a continuación se aplican a archivos regulares, directorios y enlaces simbólicos:

-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 de ejemplo:

#!/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



Debes tener cuidado con la ejecución test para una variable sin comillas, porque puede producir resultados inesperados:

$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1

La recomendación generalmente es tener la variable probada rodeada de comillas dobles:

#!/bin/sh
FILE=$1

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

28
2018-01-24 19:43



Hay tres maneras distintas de hacer esto:

  1. Niega el estado de salida con bash (ninguna otra respuesta ha dicho esto):

    if ! [ -e "$file" ]; then
        echo "file does not exist"
    fi
    

    O:

    ! [ -e "$file" ] && echo "file does not exist"
    
  2. Negar la prueba dentro del comando de prueba [ (esa es la forma en que la mayoría de las respuestas anteriores han presentado):

    if [ ! -e "$file" ]; then
        echo "file does not exist"
    fi
    

    O:

    [ ! -e "$file" ] && echo "file does not exist"
    
  3. Actúe sobre el resultado de que la prueba sea negativa (|| en lugar de &&)

    Solamente:

    [ -e "$file" ] || echo "file does not exist"
    

    Esto parece tonto (IMO), no lo use a menos que su código tenga que ser portátil para el shell Bourne (como el /bin/sh de Solaris 10 o anterior) que carecían del operador de negación de canalización (!)

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi
    

18
2017-08-05 18:10