Melhorando seu código atual, este comando deve ser útil:
for d in ./*;do [[ -d "$d" ]] && echo "$d" >> dir.txt; done
Para remover o ./
da saída:
for d in ./*;do [[ -d "$d" ]] && echo "${d##./}" >> dir.txt; done
Eu quero fazer uma lista dos meus subdiretórios. Quando executo o loop a seguir, o primeiro nome do diretório ocorre duas vezes
for d in */; do
echo $d >> directories.txt
done
A saída é como:
ONE/
TWO/
ONE/
Onde está o problema?
Melhorando seu código atual, este comando deve ser útil:
for d in ./*;do [[ -d "$d" ]] && echo "$d" >> dir.txt; done
Para remover o ./
da saída:
for d in ./*;do [[ -d "$d" ]] && echo "${d##./}" >> dir.txt; done
Você está anexando as entradas (>>)
onde deve substituí-las (>)
. É melhor usar find
. Para encontrar todos os subdiretórios recursivamente, use
find . -type d > directories.txt
Para encontrar subdiretórios somente no diretório atual, use
find . -type d -maxdepth 1 > directories.txt
-type d
instrui a localizar apenas os arquivos de diretório.
O que me surpreende é a falta de um ponto-e-vírgula (;) em sua solução, seu problema persiste quando você o faz:
for d in *; do echo $d >> directories.txt; done
Isso funciona bem para mim. Além disso, tem certeza de que você o executa na bash? Finalmente, o "> >" pode ser o problema, você pode estar anexando nomes de diretórios várias vezes.
Sem mencionar que, se você quiser listar apenas os diretórios (não os arquivos), você pode fazer:
for d in 'find . -type d -maxdepth 1'; do echo $d >> directories.txt; done
ou ainda mais simples:
find . -type d -maxdepth 1 > directories.txt