Loop dos arquivos de listagem no UNIX

Loop dos arquivos de listagem no UNIX

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; findem 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 -lsaí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 forloop percorre todas as entradas retornadas por lse iftesta 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

informação relacionada