Uma estrela está sendo impressa para um diretório vazio depois de executar um script para listar a subpasta

7

Eu estava tentando escrever um script de shell que pegaria um caminho de diretório d como argumento e imprimiria recursivamente uma lista de profundidade de todos os arquivos e diretórios em d. No entanto, o argumento d é opcional e, se nenhum argumento for fornecido, uma lista de todos os arquivos e diretórios no diretório atual será impressa. Aqui está o meu código:

# the method for tree

myspace=""
spaceCount=0
tree(){     
  cd "$1"
  for i in *; do
    if [ -d "$i" ]; then
      echo -n "|"   
      for (( j=0;j<spaceCount;j++ )) 
      do 
        echo -n "$myspace"  
      done
      echo "--$i"
      spaceCount=$((spaceCount+1)) 
      myspace="  |"
      tree "$i"
    else
      echo -n "|"
      for (( j=0;j<spaceCount;j++ )) 
      do 
        echo -n "$myspace"  
      done
      echo "--$i"
    fi
  done
  cd ../
  spaceCount=$((spaceCount-1))
}


if [ "$1" != "" ]; then
  file="$1"
fi
echo ".$file"
tree "$file"

Mas quando uma pasta está vazia, está imprimindo uma estrela como esta:

Como posso resolver o problema?

    
por sphoenix 05.10.2017 / 19:36

1 resposta

10

Em bash e shells semelhantes a Bourne em geral ( zsh sendo a exceção), globs como * que não correspondem a nenhum arquivo expandem para si mesmos (seu script usa ksh93 sintaxe, também reconhecido por bash e zsh , embora em zsh você tenha erros fatais por padrão para globs não correspondentes.

echo * em um diretório que não contém arquivos (ou apenas arquivos ocultos) gera * .

Aqui, em vez de for i in * , use for i in *(N) ( zsh ) ou for i in ~(N)* ( ksh93 ) ou, se usar bash , defina a opção nullglob (com shopt -s nullglob ) para que as bolas que não combinam se expandirem não façam nada.

Como alternativa, você pode adicionar um [ -e "$i" ] || continue no início ou seu for loop para filtrar o * verificando a existência do arquivo (isso afetaria o comportamento dos diretórios que você leu, mas não as permissões de pesquisa) .

Mais leitura em Por que o nullglob não é padrão?

¹ Nesses diretórios, * se expandiria para todos os arquivos não ocultos, mas [ -e "$i" ] retornaria false para todos eles, pois a chamada de sistema stat() retornaria com permissão negada

    
por 05.10.2017 / 19:44