Quiero verificar la existencia de múltiples directorios, digamos dir1, dir2y 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
lsutilidad para determinar si se produjeron uno o más "errores" :Redirijo la salida y stderr a
/dev/nullpara que desaparezca, ya que solo nos importa el código de salidals, no su salida. Todo lo que está escrito/dev/nulldesaparece, no está escrito en su terminal.fuente
1es stdout,2es stderr y sé lo que es la redirección. No entiendo el significado de/dev/null, y no sé cómo analizar el comando.&>filenameredirige 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?-dopción (a), por lo quelssolo 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
breakhace 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: "-ay-olos 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:
resultado = verdadero para dir en \ "$ PWD / dir1" \ "$ PWD / dir2" \ "$ PWD / dir3" hacer Si ! [-d "$ dir"]; entonces resultado = falso rotura fi hecho para dir en \ "$ PWD / dir4" \ "$ PWD / dir5" \ "$ PWD / dir6" hacer si [-e "$ dir"]; luego # Nota: no "!" resultado = falso rotura fi echo hecho "$ resultado"Solía[ -e "$dir" ]probar si"$dir"existe; es decir, sidir5existe 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 hazpara dir en \ "dir1" \ "dir2" \ "dir3" hacer ︙fuente