Como verificar se uma pasta está vazia ou não e usar seu conteúdo em uma instrução if-then-else?

Como verificar se uma pasta está vazia ou não e usar seu conteúdo em uma instrução if-then-else?

Preciso verificar se uma pasta está vazia ou não e de acordo com a saída preciso executar alguns outros comandos. Estou trabalhando no Ubuntu 18.04.5 LTS.

Meu script bash:

if [ "$(ls -A /mnt/mamdrive/"As Metadata"/)" ] || ["$(ls -A /mnt/mamdrive/"As Video"/)"  ]; then
    echo "copy file"
else
    echo "dont copy"
fi

A condição funciona às vezes, mas às vezes não e é difícil reproduzi-la. Existe alguma outra maneira de verificar se o diretório está vazio e executar alguma ação adequada?

Responder1

Eu sugeriria algo que não depende da saída da string ls- por exemplo, testar se há algum resultado de uma expansão glob:

#!/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

Se você quiser testar se dois diretórios estão vazios, você pode simplesmente agrupar ambos:

set -- /mnt/mamdrive/"As Metadata"/* /mnt/mamdrive/"As Video"/*

Responder2

A maneira mais fácil é usar ls -Auma ifdeclaração 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

Responder3

findem conjunto com ifnepode funcionar como uma cópia vazia:

$ find test/ -maxdepth 0 -empty | ifne cp -t test/ a

Usá-lo em uma instrução if pode ser algo assim:

#!/bin/bash

if find test/ -maxdepth 0 ! -empty | ifne false; then
   echo Directory is empty
else
   echo Directory is not empty
fi

Responder4

Como lsé sabido que a análise é propensa a erros porque, para começar, não foi planejada para ser analisável, outras soluções devem ser preferidas. Além da resposta do @steeldriver, isso também pode ser feito 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

maxdepthe mindepthas opções são usadas aqui para imprimir e digitalizar apenas filhos diretos de diretórios especificados. O redirecionamento garante que as mensagens de erro não serão impressas se alguns argumentos não existirem.

Adicionar vários diretórios funcionará como OR, portanto, "copiar arquivo" será impresso se pelo menos um dos diretórios testados não estiver vazio. O uso findtambém permite um ajuste mais preciso usando seus argumentos, como nomes de arquivos, tipos de arquivos e muito mais.

informação relacionada