¿Existe un comando para mostrar el mensaje "Sí" si existe un archivo en particular? No es necesario dar funcionalidad si el archivo no existe.
command-line
James
fuente
fuente
[ -e FILENAME ] && echo Yes
FILENAME
es una expansión variable o contiene caracteres especiales, no olvide citarla. por ejemplo, en un guión,[ -e "$1" ] && echo Yes
.[[
y en]]
lugar de citar la variable.[[ ]]
, siempre es un buen hábito para los principiantes que no recuerdan las reglas especiales para dentro del[[ ]]
operador, o para contextos aritméticos.Puedes usar este simple script:
Guárdalo como
file-exists.sh
. Luego, en la Terminal, escribachmod +x file-exists.sh
.Úselo como:
./file-exists.sh FILE
donde reemplazaFILE
con el archivo que desea verificar, por ejemplo:Si
file.txt
existe,Yes
se imprimirá en la Terminal y el programa saldrá con el estado 0 (correcto). Si el archivo no existe, no se imprimirá nada y el programa saldrá con el estado 1 (error).Si tienes curiosidad por qué incluí el
exit
comando, sigue leyendo ...¿Qué pasa con el
exit
comando?exit
provoca la terminación normal del proceso. Lo que esto significa es, básicamente: detiene el script. Acepta un parámetro opcional (numérico) que será el estado de salida del script que lo llamó.Este estado de salida permite que sus otros scripts utilicen su
file-exists
script y es su forma de saber si el archivo existe o no.Un ejemplo simple que pone esto en uso es este script (guárdelo como
file-exists-cli.sh
):Haga lo habitual
chmod +x file-exists-cli.sh
y luego ejecutarlo:./file-exists-cli.sh
. Verás algo como esto:El archivo existe (
exit 0
):El archivo no existe (
exit 1
):fuente
"$1"
. Si tiene espacio en blanco, se romperá sin comillas y pueden ocurrir otras cosas malas.En el shell bash en la línea de comando.
Esto utiliza el operador condicional bash
-f
y verifica si el archivo existe y si es un archivo normal. Si desea probar cualquier archivo, incluidos directorios y enlaces, utilice-e
.Este es un gran recurso para los condicionales de bash.
fuente
test
su formato original, sé que es excesivo, pero es un hábito mío.[
comando, que generalmente se llama un builtin incorporado). Corrigen las inconsistencias y los comportamientos tontos de la versión de llave simple. El [incorporado permanece por compatibilidad, pero no veo ninguna buena razón para usarlo en el nuevo código bash. (Si necesita escribir scripts compatibles con POSIX que puedan ejecutarse en shells antiguos o algo así, eso es diferente.)[
son dudosas.type -a [
para mí enumera "shell incorporado", luego "/usr/bin/[
."type
resultados parecen corroborar lo que dije, ¿no?El comando más corto para hacer lo que quieres es:
test -e
probará si el nombre dado existe en el sistema de archivos. (Puede usartest -f
para restringir solo a archivos normales. Consulteman test
para obtener más información).Si la condición dada se evalúa como verdadera,
test
devuelve un estado de salida exitoso (de lo contrario, devuelve un estado de falla). Combinamos los dos comandos usando&&
, lo que significa "ejecutar el siguiente comando si el comando anterior salió con un estado de éxito". El siguiente comando simplemente imprimeYes
en la salida estándar; en el caso de un shell interactivo, en el terminal.Esto evita el material textual adicional de una
if
declaración, pero da el mismo resultado. Usar&&
(o su opuesto||
) para vincular comandos funciona bien cuando solo se trata de un comando. Si desea hacer más que ejecutar un solo comando en respuesta al estado de salida de un solo comando, el uso de laif
sintaxis se vuelve mucho más legible rápidamente.Como ya se señaló en otras respuestas, la
if
construcción de estilo equivalente sería:o alternativamente:
Para estos fines,
[
ytest
son equivalentes, excepto que[
exige una terminación]
.fuente
Para cubrir este tipo de preguntas, hay varias formas, y aquí hay otra: use el
find
comando con-exec
bandera. La ruta al archivo se puede dividir en dos partesfind /etc
que establece el directorio y-name FILENAME
que especifica el nombre del archivo (¡duh!).-maxdepth
seguiráfind
trabajando/etc
solo con el directorio y no descenderá a subdirectoriosOtra forma, a través de
stat
:Y alternativamente a través de python:
O una alternativa de línea de comando corta:
fuente