Lidando com a instrução if

0

Aprimorei o código da pergunta que publiquei antes:

Meu código é:

DIR="$1"


if [ -e "$DIR" ]

then

     echo -n "total directories:" ; find $DIR -type d | wc -l

     echo -n "total files:" ; find $DIR -type f | wc -l
else
if [ -f "$DIR" ]
then
    echo " Directory doesn't exist"

else
     echo  " please pass correct arguments"
fi
fi

Este código dá saída quando eu executo ./countfiledirs ou countfiledirs jhfsakl :

sreekanth@sreekanth-VirtualBox:~$  ./countfiledirs 
 please pass correct arguments
sreekanth@sreekanth-VirtualBox:~$  ./countfiledirs ffff
 please pass correct arguments

Eu quero saída quando eu executei o nome do script ./countfiledirs as:

please pass correct arguments

e para ./countfiledirs ffff como:

directory doesn't exists

Eu tenho outro problema com o código quando excedi o script ./countfiledirs /usr/share . Não está dando o número de diretórios e subdiretórios para o caminho que eu dei. Em vez de 3 diretórios, ele mostra 4

    
por buddha sreekanth 05.05.2015 / 15:08

2 respostas

2

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'."
    
por 05.05.2015 / 15:38
1

Como você tem em sua última condição, você está verificando se $ DIR se refere a um "arquivo regular". Ou seja, não é um diretório. Então, está sempre falhando (já que você está sempre dando diretórios, presumivelmente) e imprimindo "por favor, passe argumentos corretos".

Quanto às contagens de diretório serem "incorretas", elas não são. Se você tivesse que executar o comando find manualmente, como está no script, veria que ele retorna o diretório na raiz de sua pesquisa, bem como em seus subdiretórios. Assim, você pode saber que está contando o diretório fornecido ou obter a resposta desejada simplesmente diminuindo a contagem após chamar a localização.

Isso parece ser o que você está procurando. Fique comigo; Eu verifiquei que isso funciona, mas não sou especialista em BASH.

DIR="$1"

if [ ! -d "$DIR" ]  #If not a directory, 
then
    echo " please pass correct arguments"
    exit 1
fi

# We know for sure $DIR is present and a directory, so we know
# that it will show up in the find results for type d. Decrement.
echo -n "total directories:" $(($(find $DIR -type d | wc -l) - 1))
echo
echo -n "total files:" ; find $DIR -type f | wc -l
    
por 05.05.2015 / 15:45