Aqui está uma maneira compatível com POSIX de testar se dir
está vazio usando apenas construções de shell internas. O comando set
define os argumentos posicionais para arquivos de ponto (incluindo os sempre existentes .
e ..
) seguidos por arquivos sem ponto. Se o diretório estiver vazio, o .*
glob corresponderá apenas a .
e ..
, e o *
glob não corresponderá a nada, portanto, não será expandido.
set dir/.* dir/*
[ "$1" = "dir/." ] && [ "$2" = "dir/.." ] && ! [ -e "$3" ] && ! [ -L "$3" ]
Isso funciona no ATT ksh, mas falha com alguns shells que omitem as entradas .
e ..
. Para ser mais portável, você também precisa permitir que .*
não corresponda a nada.
set dir/.* dir/*
case $# in
0) true;; # can't happen in a standard shell, this is for shells with nullglob
2) { [ "$1" = "dir/.*" ] && [ "$2" = "dir/*" ] && ! [ -e "$1" ] && ! [ -L "$1" ] && ! [ -e "$2" ] && ! [ -L "$2" ]; } ||
{ [ "$1" = "dir/." ] && [ "$2" = "dir/.." ]; };;
3) [ "$1" = "dir/." ] && [ "$2" = "dir/.." ] && ! [ -e "$3" ] && ! [ -L "$3" ];;
*) false;;
esac
Versões recentes suficientes do ksh permitem um teste mais simples, mas acho que o AIX é muito antigo (mesmo o ksh93
). Veja como você pode testar se dir
está vazio em um ksh93 recente:
FIGNORE='.?(.)'; set -- ~(N)dir/*; [[ $# -eq 0 ]]
ou alternativamente
FIGNORE=; set -- dir/*; [[ $# -eq 2 ]]
Uma abordagem alternativa é chamar find
. Isso é mais simples porque find
não trata os arquivos pontuais especialmente e não tem nada parecido com a dificuldade do shell em distinguir entre um padrão que combina com um único arquivo e um padrão que não foi expandido porque não combina com nada. >
[ -z "$(find dir/. -name . -o -print | head -n 1)" ]