if ls -1qA ./somedir/ | grep -q .
then ! echo somedir is not empty
else echo somedir is empty
fi
O acima é um teste compatível com POSIX - e deve ser muito rápido. ls
listará todos os arquivos / dirs em um diretório, exceto .
e ..
cada um por linha e -q
todos os caracteres não imprimíveis (para incluir \n
ewlines) na saída com um ponto de interrogação ?
. Dessa forma, se grep
receber até mesmo um único caractere na entrada, ele retornará true - else false.
Para fazer isso apenas em um POSIX-shell:
cd ./somedir/ || exit
set ./* ./.[!.]* ./..?*
if [ -n "$4" ] ||
for e do
[ -L "$e" ] ||
[ -e "$e" ] && break
done
then ! echo somedir is not empty
else echo somedir is empty
fi
cd "$OLDPWD"
Um POSIX-shell (que não desativou anteriormente -f
nome_do_arquivo) irá set
a "$@"
posicional-parâmetro para as seqüências literais seguidas pelo comando set
acima, ou então para os campos gerados pelos operadores glob no final de cada um. Se isso acontece, depende se as globs realmente correspondem a alguma coisa. Em alguns shells, você pode instruir um glob não-resolvente a se expandir para null - ou nada. Isso às vezes pode ser benéfico, mas não é portável e muitas vezes vem com problemas adicionais - como ter que definir opções de shell especiais e depois desativá-las.
O único meio portátil de manipular argumentos com valor nulo envolve variáveis vazias ou não definidas ou ~
tilde-expansões. E o último, por sinal, é muito mais seguro que o primeiro.
Acima do shell, apenas um dos arquivos será testado para -e
xistence se nenhum dos três globs especificados resolver mais de uma única correspondência. Portanto, o loop for
é executado apenas para três ou menos iterações, e apenas no caso de um diretório vazio, ou no caso de um ou mais dos padrões resolver apenas para um único arquivo. O for
também break
s se qualquer um dos globs representar um arquivo real - e como eu organizei os globs na ordem do mais provável para o menos provável, ele deveria praticamente sair da primeira iteração toda vez.
De qualquer forma você deve envolver apenas um sistema stat()
call - o shell e ls
devem ambos precisar apenas de stat()
do diretório consultado e listar os arquivos seus dentries relatório que contém. Isso é contrastado pelo comportamento de find
, que, em vez disso, stat()
de todos os arquivos que você pode listar com ele.