Como posso listar arquivos por tipo com ls?


20

Quando eu uso o lscomando com a opção -l, a primeira sequência de letras fornece as informações sobre cada arquivo, e a primeira letra dessa sequência fornece o tipo do arquivo. ( d= diretório, -= arquivo padrão, l= link etc.)

Como posso filtrar os arquivos de acordo com a primeira letra?


2
Pense o que você quer é este: superuser.com/a/109542
devnull

Respostas:


9

Você pode filtrar tudo, exceto os diretórios, usando grepesta maneira:

ls -l | grep '^d'

o ^indica que o padrão está no início da linha. Substitua dpor -, letc., conforme aplicável.

É claro que você pode usar outros comandos para procurar diretamente tipos específicos (por exemplo find . -maxdepth 1 -type d) ou ls -l | sortagrupar tipos semelhantes com base nesse primeiro caractere, mas se desejar filtrar, use grepapenas para selecionar as linhas apropriadas na saída.


Observe que, se houver links simbólicos, você poderá usar ls -lL. -Lseguirá links simbólicos para mostrar se está vinculado a um diretório ou arquivo.
Nux

8

Se você quiser exibir toda a saída, mas tiver arquivos do tipo semelhante listados juntos, poderá classificar a saída no primeiro caractere de cada linha:

ls -l | sort -k1,1

Alguma razão para o voto negativo?
Joseph R.

1
Provavelmente devido ao uso de uma rotina de processamento de texto, a manipulação de texto sem formatação é percebida como "não legal" ou "errada" entre certos tipos de desenvolvedores (como a maioria dos meus colegas ...). Dado um voto positivo por uma resposta simples e correta.
Mark K Cowan

8

O comando lsestá lidando com nomes de arquivos , que são registrados nas estruturas de dados do diretório. Portanto, ele realmente não se importa com o próprio arquivo, incluindo o "tipo" de um arquivo.

Um comando que é mais adequado para trabalhar em arquivos reais , não apenas seus nomes, é find. Tem uma opção que responde diretamente à sua pergunta sobre como filtrar a lista no tipo de arquivo.

Isso fornece uma lista do diretório atual semelhante a ls -l:

find . -maxdepth 1 -ls

Por padrão, findlista diretórios recursivamente, o que é desativado limitando a profundidade da pesquisa a 1.
Você pode deixar de fora o ., mas eu o incluí para mostrar que os diretórios precisam ser listados antes das opções.

Com -type, você pode filtrar por tipo de arquivo, expresso como fou dpara arquivos ou diretórios simples:

find . -maxdepth 1 -type d -ls

Existem outros valores de filtro para -type, principalmente lpara links simbólicos.
Observe que há uma complicação com links simbólicos :
neste caso l, existem dois tipos de arquivo :, indicando um link simbólico e algo assim f, indicando o tipo de arquivo vinculado. Existem opções para especificar como lidar com isso, para que você possa escolher.


De man find:

    -type c
           File is of type c:

           b      block (buffered) special

           c      character (unbuffered) special

           d      directory

           p      named pipe (FIFO)

           f      regular file

           l      symbolic link; this is never true if the  -L  option
                  or  the -follow option is in effect, unless the sym‐
                  bolic link is broken.  If you  want  to  search  for
                  symbolic links when -L is in effect, use -xtype.

           s      socket

           D      door (Solaris)

e relevante para o manuseio de links simbólicos:

    -xtype c
           The  same as -type unless the file is a symbolic link.  For
           symbolic links: if the -H or -P option was specified,  true
           if the file is a link to a file of type c; if the -L option
           has been given, true if c is `l'.  In other words, for sym‐
           bolic  links, -xtype checks the type of the file that -type
           does not check.

e

    -P     Never follow symbolic links.  This is  the  default  behav‐
           iour.  When find examines or prints information a file, and
           the file is a symbolic link, the information used shall  be
           taken from the properties of the symbolic link itself.


    -L     Follow symbolic links.  When find examines or prints infor‐
           mation about files, the information  used  shall  be  taken
           from  the  properties of the file to which the link points,
           not from the link itself (unless it is  a  broken  symbolic
           link  or  find  is  unable to examine the file to which the
           link points).  Use of this option implies -noleaf.  If  you
           later  use  the -P option, -noleaf will still be in effect.
           If -L is in effect and find discovers a symbolic link to  a
           subdirectory during its search, the subdirectory pointed to
           by the symbolic link will be searched.

           When the -L option is in effect, the -type  predicate  will
           always  match  against the type of the file that a symbolic
           link points to rather than the link itself (unless the sym‐
           bolic  link  is  broken).   Using  -L causes the -lname and
           -ilname predicates always to return false.


    -H     Do not follow symbolic links, except while  processing  the
           command  line  arguments. [...]

2

Se você está mais preocupado em solicitar as pastas para outros tipos de arquivo, pode optar por

ls --group-directories-first

caso contrário, acho que você deve canalizar a saída de ls -l através de classificação ou através de grep, conforme respondido por Anthon


2
ls -l | awk '/^d/{print $NF}

O awk vai pegar tudo o que começa com d. como d é para o diretório e você precisa imprimir o último campo para listar o nome do diretório


1
ls -l | sort 

Isso classificará o resultado de acordo com a ordem alfabética de cada resultado. Se o primeiro caractere é o critério que você deseja, é isso. Se você precisar apenas dos nomes dos arquivos, poderá tentar:

ls -l | sort | cut -f 2 -d ' ' 

Ou algo semelhante (esse comando classifica e depois divide cada linha usando o delimitador de espaço, depois retorna o segundo grupo.


obrigado pela edição Tico, é difícil ver o que você digita no telefone.
Fabio
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.