He usado el siguiente script 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
if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi;
Probablemente sea bueno que haya encontrado esta pregunta y aprendí a hacerlo de una manera más adecuada. :)-e
. -f no recogerá directorios, enlaces simbólicos, etc.FILE=$1
->FILE="$1"
yif [ -f $FILE ];
->if [ -f "$FILE" ];
Respuestas:
El comando de prueba (
[
aquí) tiene un operador lógico "no", que es el signo de exclamación (similar a muchos otros idiomas). Prueba esto:fuente
if [ ! \( -f "f1" -a -f "f2" \) ] ; then echo MISSING; fi
if [ ! -f "f1" ] || [ ! -f "f2" ] ; then echo MISSING; fi
[ -f /tmp/foo.txt ] || echo "File not found!"
-e: Returns true value, if file exists
-f: Return true value, if file exists and regular file
-r: Return true value, if file exists and is readable
-w: Return true value, if file exists and is writable
-x: Return true value, if file exists and is executable
-d: Return true value, if exists and is a directory
! -f
con&&
versus usar-f
con||
. Esto tiene que ver con el código de salida devuelto por la verificación de no existencia. Si necesita que su línea siempre salga limpiamente con el código de salida 0 (y a veces no desea esta restricción), los dos enfoques no son intercambiables. Alternativamente, solo use unaif
declaración y ya no tendrá que preocuparse por el código de salida de su verificación de no existencia.Prueba de archivo bash
-b filename
- Bloquear archivo especial-c filename
- Archivo de caracteres especiales-d directoryname
- Verificar existencia de directorio-e filename
- Verificar existencia de archivo, independientemente del tipo (nodo, directorio, socket, etc.)-f filename
- Verificar existencia de archivo normal no un directorio-G filename
- Verificar si el archivo existe y es propiedad de ID de grupo efectivo-G filename set-group-id
- Verdadero si el archivo existe y es set-group-id-k filename
- Bit Sticky-L filename
- Enlace simbólico-O filename
- Verdadero si el archivo existe y es propiedad del ID de usuario efectivo-r filename
- Verifique si el archivo es legible-S filename
- Verifique si el archivo es socket-s filename
- Verifique si archivo es de tamaño distinto de cero-u filename
- Comprobar si el bit archivo de conjunto-user-id se fija-w filename
- Comprobar si el archivo se puede escribir-x filename
- Comprobar si el archivo es ejecutableCómo utilizar:
Se puede negar una expresión de prueba utilizando el
!
operadorfuente
-n String
- Comprueba si la longitud de la cadena no es cero. ¿O quieres decirfile1 -nt file2
? Comprueba si el archivo 1 es más nuevo que el archivo 2 (también puedes usar -ot para versiones anteriores)The unary operator -z tests for a null string, while -n or no operator at all returns True if a string is not empty.
~ ibm.com/developerworks/library/l-bash-test/index.htmlPuede negar una expresión con "!":
La página de manual relevante es
man test
o, de manera equivalente,man [
-help test
ohelp [
para el comando bash incorporado.fuente
[
es un incorporado. Entonces, la información relevante se obtiene más bien porhelp [
... pero esto muestra que[
es un sinónimo de latest
construcción, por lo tanto, la información relevante se obtiene más bien porhelp test
. Consulte también la sección Expresión condicional de Bash en el manual .[
se comporta de mando de manera muy similar a lo externo[
de comandos, así que o bienman test
oman [
le dará una buena idea de cómo funciona.[
tiene más interruptores que el comando externo que se[
encuentra en mi sistema ... En general, creo que es mejor leer la documentación específica de una herramienta determinada, y no la documentación específica de otra vagamente relacionada. Aunque podría estar equivocado;)
Además, es posible que el archivo sea un enlace simbólico roto, o un archivo no regular, como por ejemplo un socket, dispositivo o fifo. Por ejemplo, para agregar un cheque por enlaces simbólicos rotos:
fuente
Vale la pena mencionar que si necesita ejecutar un solo comando puede abreviar
a
o
fuente
Prefiero hacer el siguiente one-liner, en formato compatible con shell POSIX :
Para un par de comandos, como lo haría en un script:
¡Una vez que comencé a hacer esto, rara vez uso la sintaxis completamente tipada!
fuente
[
otest
incorporado probaría la existencia del argumento por defecto (en lugar de-e
)? ¿No sería eso ambiguo? AFAIK (y AIUI la sección "EXPRESIONES CONDICIONALES") lo único que se prueba con su enfoque es que el argumento no está vacío (o indefinido), que es, en este caso, una tautología ($DIR = ''
y$FILE = ''
luego el argumento sigue siendo'//'
)ls /foo
resultadols: cannot access /foo: No such file or directory
.[ /foo ] && echo 42
, resultado42
. GNU bash, versión 4.2.37 (1) -release (i486-pc-linux-gnu).-f
opción, en el momento en que escribí esta respuesta. Obviamente, siempre podría usar-e
, si no está seguro de que será un archivo normal. Además, en todas mis secuencias de comandos, cito estas construcciones, debo haber presentado esto sin la prueba adecuada.[ $condition ] && if_true || if_false
es propenso a errores. En cualquier caso, me resulta[ ! -f "$file" ] && if_not_exists
más fácil de leer y entender que[ -f "$file" ] || if_not_exists
.Para probar la existencia del archivo, el parámetro puede ser cualquiera de los siguientes:
Todas las pruebas a continuación se aplican a archivos, directorios y enlaces simbólicos normales:
Script de ejemplo:
fuente
Puedes hacerlo:
o
Si desea verificar el archivo y la carpeta, use la
-e
opción en lugar de-f
.-e
devuelve verdadero para archivos regulares, directorios, socket, archivos especiales de caracteres, archivos especiales de bloque, etc.fuente
[
embargo, tiene una ventaja limitada sobre la utilidad estándar aquí.-f
) y los directorios son solo dos de muchos tipos diferentes de archivos . También hay sockets, enlaces simbólicos, dispositivos, fifos, puertas ...[ -e
probará la existencia del archivo (de cualquier tipo, incluido regular, fifo, directorio ...) después de la resolución del enlace simbólico .-e
, él necesita-f
.Debe tener cuidado al ejecutar
test
una variable sin comillas, ya que podría producir resultados inesperados:La recomendación generalmente es tener la variable probada entre comillas dobles:
fuente
[ ... ]
.Hay tres formas distintas de hacer esto:
Niegue el estado de salida con bash (ninguna otra respuesta ha dicho esto):
O:
Niegue la prueba dentro del comando de prueba
[
(esa es la forma en que la mayoría de las respuestas se han presentado antes):O:
Actúe sobre el resultado de que la prueba sea negativa (en
||
lugar de&&
):Solamente:
Esto parece una tontería (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ía del operador de negación de canalización (!
):fuente
! [
y[ !
?! [
es POSIX para oleoductos de Shell 2.9.2 (cualquier comando)Otherwise, the exit status shall be the logical NOT of the exit status of the last command
y[ !
es POSIX para la prueba! expression True if expression is false. False if expression is true.
lo tanto, ambos son POSIX, y en mi experiencia, ambos son compatibles ampliamente.!
palabra clave introducida por el shell Korn. Excepto tal vez para Solaris 10 y versiones anteriores, es poco probable que encuentre un shell Bourne en estos días.En
el
[
comando realiza unastat()
(nolstat()
) llamada al sistema en la ruta almacenada$file
y devuelve verdadero si esa llamada al sistema tiene éxito y el tipo de archivo que devuelvestat()
es " regular ".Entonces, si
[ -f "$file" ]
devuelve verdadero, puede decir que el archivo existe y que es un archivo normal o un enlace simbólico que finalmente se resuelve en un archivo normal (o al menos lo era en el momento destat()
).Sin embargo si devuelve falso (o si
[ ! -f "$file" ]
o! [ -f "$file" ]
devolver true), hay muchas posibilidades diferentes:stat()
llamada al sistema puede fallar.En resumen, debería ser:
Para saber con certeza que el archivo no existe, necesitaríamos que la
stat()
llamada del sistema regrese con un código de error deENOENT
(ENOTDIR
nos dice que uno de los componentes de la ruta no es un directorio, es otro caso en el que podemos decir que el archivo no existir por ese camino). Desafortunadamente, el[
comando no nos deja saber eso. Devolverá falso si el código de error es ENOENT, EACCESS (permiso denegado), ENAMETOOLONG o cualquier otra cosa.La
[ -e "$file" ]
prueba también se puede hacer conls -Ld -- "$file" > /dev/null
. En ese caso,ls
le diremos por quéstat()
falló, aunque la información no se puede usar fácilmente mediante programación:Al menos
ls
me dice que no es porque el archivo no existe que falla. Es porque no puede decir si el archivo existe o no. El[
comando simplemente ignoró el problema.Con el
zsh
shell, puede consultar el código de error con la$ERRNO
variable especial después del[
comando que falla y decodificar ese número utilizando la$errnos
matriz especial en elzsh/system
módulo:(Tenga en cuenta que el
$errnos
soporte se rompió con algunas versiones dezsh
cuando se creó con versiones recientes degcc
).fuente
Para revertir una prueba, use "!". Eso es equivalente al operador lógico "no" en otros idiomas. Prueba esto:
O escrito de una manera ligeramente diferente:
O podrías usar:
O, presionando todos juntos:
Que puede escribirse (usando el operador "y": &&) como:
Que se ve más corto así:
fuente
La
test
cosa también puede contar. Funcionó para mí (basado en Bash Shell: Verificar archivo existe o no ):fuente
Este código también funciona.
fuente
La forma mas simple
fuente
Este script de shell también funciona para encontrar un archivo en un directorio:
fuente
read -p "Enter file name: " -r a
para preguntar y leer. Utiliza comillas alrededor de la variable; eso es bueno, pero debería explicarse. Podría ser mejor si se hizo eco del nombre del archivo. Y esto comprueba que el archivo existe y no está vacío (ese es el significado de-s
), mientras que la pregunta se refiere a cualquier archivo, vacío o no (para el cual-f
es más apropiado).a veces puede ser útil usar && y || operadores.
Como en (si tiene el comando "prueba"):
o
fuente
Si desea usar en
test
lugar de[]
, puede usar!
para obtener la negación:fuente
También puede agrupar múltiples comandos en un solo revestimiento
[ -f "filename" ] || ( echo test1 && echo test2 && echo test3 )
o
[ -f "filename" ] || { echo test1 && echo test2 && echo test3 ;}
Si el nombre de archivo no sale, la salida será
Nota: (...) se ejecuta en un subshell, {...;} se ejecuta en el mismo shell.
La notación de corchete funciona solo en bash.fuente
fuente