Quiero verificar la existencia de múltiples directorios, digamos dir1
, dir2
y dir3
, en el directorio de trabajo.
Tengo lo siguiente
if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi
Pero sospecho que hay una forma más elegante de hacer esto. No asuma que hay un patrón en los nombres de los directorios.
El objetivo es verificar la existencia de unos pocos directorios y la inexistencia de otros.
Estoy usando Bash, pero se prefiere el código portátil.
shell-script
shell
files
directory
control-flow
Elegancia
fuente
fuente
$PWD
, por cierto.[ -d "$PWD/dir1"]
es equivalente a[ -d "dir1" ]
.Respuestas:
Si ya espera que sean directorios y solo está verificando si todos existen, puede usar el código de salida de la
ls
utilidad para determinar si se produjeron uno o más "errores" :Redirijo la salida y stderr a
/dev/null
para que desaparezca, ya que solo nos importa el código de salidals
, no su salida. Todo lo que está escrito/dev/null
desaparece, no está escrito en su terminal.fuente
1
es stdout,2
es stderr y sé lo que es la redirección. No entiendo el significado de/dev/null
, y no sé cómo analizar el comando.&>filename
redirige tanto stdout como stderr afilename
. Entonces, ¿no podría simplificarse el comando (al menos para mí es más simple) comols "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there
?-d
opción (a), por lo quels
solo necesita registrar los directorios y no leerlos, y (b) para que el comando tenga éxito incluso si el usuario no tiene acceso de lectura a los directorios. (2) No veo ninguna razón para usar,"$PWD/"
excepto para proteger contra directorios cuyos nombres comienzan con-
(y, por supuesto, hay mejores formas de hacerlo).Me gustaría bucle:
Esto
break
hace que el bucle se cortocircuite, al igual que su cadena de&&
fuente
Un bucle podría ser más elegante:
Esto es Bash Una más portátil es Sh. Allí puede usar la matriz posicional:
Luego, para recorrerlo, úsalo
"$@"
.fuente
¿Por qué no solo:
fuente
But I suspect there is a more elegant way of doing this
-a
: "-a
y-o
los operadores primarios binarios (...) han sido marcados como obsoletos": pubs.opengroup.org/onlinepubs/9699919799test
(aka[
) tres veces esto lo invoca una vez,Según la pregunta, dos funciones de shell portátiles que prueban la existencia y la inexistencia de múltiples directorios:
Ejemplo:
fuente
Sobre la base de la respuesta de Glenn Jackman , podemos probar la inexistencia de otros nombres como este:
Solía[ -e "$dir" ]
probar si"$dir"
existe; es decir, sidir5
existe pero es un archivo, el resultado esFalse
. Si solo desea probar si los nombres en el segundo grupo son directorios, use[ -d "$dir" ]
, como en el primer bucle.Como estamos hablando de verificar la existencia de cosas en el directorio de trabajo actual, probablemente no sea necesario especificar
$PWD/
los nombres; solo hazfuente