¿Cómo comprobar si una carpeta está vacía o no y utilizar su contenido en una declaración if-then-else?

¿Cómo comprobar si una carpeta está vacía o no y utilizar su contenido en una declaración if-then-else?

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 -Auna ifdeclaració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

findjunto con ifnepuede 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 lses 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

maxdepthy mindepthlas 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 findtambién permite realizar ajustes más precisos utilizando sus argumentos, como nombres de archivos, tipos de archivos y mucho más.

información relacionada