
Eu dei o comando:
ls -lrt
e os arquivos e diretórios listados são:
drwxr-xr-x 4 root root 4096 Feb 2 2014 abc
drwxr-xr-x 4 root root 4096 Feb 2 2014 cde
drwxr-xr-x 4 root root 4096 Feb 2 2014 efg
-rwxr-xr-x 4 root root 4096 Feb 2 2014 aaa.txt
Agora quero descobrir se os arquivos de saída listados são diretórios ou não, usando o loop for ou o loop while.
Responder1
Com ls
, use o comando abaixo para listar apenas os diretórios.
ls -d -- */
Para listar arquivos regulares usando o próprio ls (e assumindo que os nomes dos arquivos não contêm caracteres de nova linha), você pode usar o comando abaixo.
ls -p | grep -v /
Para listar apenas os arquivos regulares, com GNU e algumas outras implementações de localização, você pode usar
find . -maxdepth 1 -type f
(observe que ao contrário do anterior, também inclui arquivos ocultos e a lista não está ordenada)
O equivalente padrão seria:
find . ! -name . -prune -type f
Responder2
Se você deseja ter algo como um "modelo de script de shell" sobre como fazer um loop no conteúdo do diretório e executar ações com base no tipo de arquivo, o seguinte pode lhe dar uma dica:
for f in *
do
if [[ -d "$f" ]]
then
... your processing of directories here, reference them as "$f" ...
fi
done
Isso examinaria todas as entradas no diretório atual, verificaria se são diretórios e executaria qualquer processamento desejado nelas. Observe que a sintaxe do diretório test é específica do BASH; para o caso geral, use if [ -d "$f" ]
.
Outra abordagem restringiria a lista apenas às entradas do diretório:
for d in */
do
... whatever you need to do on directory "$d" ...
done
Responder3
Você não precisaria de um loop para encontrar todos os diretórios; find
em vez disso, você pode usar o comando:
find . -maxdepth 1 -type d
Isso listará todos os diretórios no diretório atual. Se você quiser a ls -l
saída, você pode fazer:
find . -maxdepth 1 -type d | xargs ls -ld
Se você realmente quiser usar um loop, poderá usar a seguinte construção:
for file in $(ls)
do
if [[ -d $file ]]
then
ls -ld $file
fi
done
O for
loop percorre todas as entradas retornadas por ls
e if
testa se a entrada é um diretório.
Responder4
listar nomes de diretórios
compgen -d
Não começando de um ponto
compgen -d -X '.*' | xargs ls -dlrt