O teste [ -f "$DIR" ]
é verdadeiro se $DIR
existir e for um arquivo . Não é isso que você quer de maneira alguma. Como sugeri na sua pergunta anterior, você deve usar $#
para verificar se um argumento foi passado. Então você pode usar -e
para verificar se esse argumento existe.
A próxima questão é que find
também listará .
, o diretório atual. Você pode usar -mindepth 1
para evitar isso com o GNU find
:
DIR="$1"
if [ $# -lt 1 ]
then
echo "Please pass at least one argument" && exit
fi
if [ -e "$DIR" ]
then
echo -n "total directories:" ; find "$DIR" -mindepth 1 -type d | wc -l
echo -n "total files:" ; find $DIR -type f | wc -l
else
echo "Directory doesn't exist"
fi
Você também pode condensar o acima (embora essa versão não diferencie entre um diretório que não existe e um que seja um arquivo, não um diretório):
dir="$1"
[ $# -lt 1 ] && echo "Please pass at least one argument" && exit
[ -d "$dir" ] && printf "total directories: %s\ntotal files:%s\n" \
$(find "$dir" -type d | wc -l) $(find "$dir" -type f | wc -l) ||
printf "%s\n" "There is no directory named '$dir'."