Necesito verificar si una carpeta está vacía o no y, según el resultado, necesito ejecutar algunos otros comandos. Estoy trabajando en Ubuntu 18.04.5 LTS.
Mi script bash:
if [ "$(ls -A /mnt/mamdrive/"As Metadata"/)" ] || ["$(ls -A /mnt/mamdrive/"As Video"/)" ]; then
echo "copy file"
else
echo "dont copy"
fi
La condición funciona a veces, pero otras no y es difícil reproducirla. ¿Hay alguna otra forma de comprobar si el directorio está vacío y realizar alguna acción en consecuencia?
Respuesta1
Sugeriría algo que no dependa de la salida de la cadena ls
, por ejemplo, probar si hay algún resultado de una expansión global:
#!/bin/bash
shopt -s nullglob # don't return literal glob if matching fails
shopt -s dotglob # make * match "almost all" like ls -A
set -- /mnt/mamdrive/"As Metadata"/*
if (( $# > 0 )); then
echo "not empty"
else
echo "empty"
fi
Si desea probar si dos directorios están vacíos, simplemente puede agruparlos a ambos:
set -- /mnt/mamdrive/"As Metadata"/* /mnt/mamdrive/"As Video"/*
Respuesta2
La forma más sencilla es utilizar ls -A
una if
declaración como esta:
path=$(ls -A '/whatever/sub directory/more spaces')
if [[ ! -z "$path" ]]; then
echo "Directory is NOT empty!"
else
echo "Directory is empty!"
fi
Respuesta3
find
junto con ifne
puede funcionar como una copia vacía:
$ find test/ -maxdepth 0 -empty | ifne cp -t test/ a
Usarlo en una declaración if puede verse así:
#!/bin/bash
if find test/ -maxdepth 0 ! -empty | ifne false; then
echo Directory is empty
else
echo Directory is not empty
fi
Respuesta4
Como ls
es bien sabido que el análisis es propenso a errores porque, para empezar, no estaba destinado a ser analizable, se deberían preferir otras soluciones. Además de la respuesta de @steeldriver, esto también se podría hacer usando find
:
if [[ "$(find '/mnt/mamdrive/As Metadata' '/mnt/mamdrive/As Video' -maxdepth 1 -mindepth 1 2>/dev/null)" ]]
then
echo “copy file”
else
echo "don't copy"
fi
maxdepth
y mindepth
las opciones se utilizan aquí para imprimir y escanear únicamente elementos secundarios directos de directorios específicos. Redirect garantiza que no se imprimirán mensajes de error si algunos argumentos no existen.
Agregar varios directorios funcionará como OR, por lo que se imprimirá "copiar archivo" si al menos uno de los directorios probados no está vacío. El uso find
también permite realizar ajustes más precisos utilizando sus argumentos, como nombres de archivos, tipos de archivos y mucho más.