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 -A
uma if
declaraçã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
find
em conjunto com ifne
pode 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
maxdepth
e mindepth
as 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 find
também permite um ajuste mais preciso usando seus argumentos, como nomes de arquivos, tipos de arquivos e muito mais.