Come posso elencare i file per tipo con ls?


20

Quando utilizzo il lscomando con l'opzione -l, la prima stringa di lettere fornisce le informazioni su ciascun file e la prima lettera in questa stringa indica il tipo di file. ( d= directory, -= file standard, l= collegamento, ecc.)

Come posso filtrare i file in base a quella prima lettera?


2
Pensa che quello che vuoi è questo: superuser.com/a/109542
devnull

Risposte:


9

Puoi filtrare tutto tranne le directory in grepquesto modo:

ls -l | grep '^d'

la ^indica che il modello è all'inizio della linea. Sostituire dcon -, lecc., A seconda dei casi.

Ovviamente puoi usare altri comandi per cercare direttamente tipi specifici (es. find . -maxdepth 1 -type d) O usare ls -l | sortper raggruppare tipi simili sulla base di questo primo carattere, ma se vuoi filtrare dovresti usare grepsolo per selezionare le righe appropriate dall'output.


Nota che se hai collegamenti simbolici potresti voler usare ls -lL. -Lseguirà i collegamenti simbolici per mostrare se è collegato a una directory o a un file.
Nux,

8

Se si desidera visualizzare tutto l'output ma i file di tipo simile sono elencati insieme, è possibile ordinare l'output sul primo carattere di ogni riga:

ls -l | sort -k1,1

Qualche motivo per il downvote?
Joseph R.,

1
Probabilmente a causa dell'utilizzo di una routine di elaborazione del testo, la manipolazione del testo in chiaro viene percepita come "non fredda" o "sbagliata" tra alcuni tipi di sviluppatori (come la maggior parte dei miei colleghi ...). Dato un voto per una risposta semplice e corretta.
Mark K Cowan,

8

Il comando ha a che lsfare con i nomi dei file , che sono registrati nelle strutture di dati della directory. Quindi non importa davvero del file stesso, incluso il "tipo" di un file.

Un comando che è più adatto a lavorare su file effettivi , non solo sui nomi, lo è find. Ha un'opzione che risponde direttamente alla tua domanda su come filtrare l'elenco in base al tipo di file.

Questo fornisce un elenco della directory corrente simile a ls -l:

find . -maxdepth 1 -ls

Per impostazione predefinita, findelenca le directory in modo ricorsivo, che è disabilitato limitando la profondità di ricerca a 1.
È possibile tralasciare la ., ma l'ho inclusa per mostrare che le directory devono essere elencate prima delle opzioni.

Con -type, puoi filtrare per tipo di file, che è espresso come fo dper file o directory semplici:

find . -maxdepth 1 -type d -ls

Esistono altri valori di filtro per -type, in particolare lper i collegamenti simbolici.
Nota che c'è una complicazione con i collegamenti simbolici :
in questo caso ci sono due tipi di file l:, che indica un collegamento simbolico e qualcosa di simile f, che indica il tipo di file collegato. Ci sono opzioni per specificare come gestirlo, quindi puoi scegliere.


Da 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 rilevanti per la gestione dei collegamenti simbolici:

    -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 sei più preoccupato per ordinare le cartelle dagli altri tipi di file, puoi andare con

ls --group-directories-first

altrimenti, penso che devi reindirizzare l'output da ls -l attraverso sort o attraverso grep come ha risposto Anthon


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

awk prenderà tutto ciò che inizia con d. come d sta per directory ed è necessario stampare l'ultimo campo per elencare il nome della directory


1
ls -l | sort 

Questo ordinerà il risultato in base all'ordine alfabetico di ciascun risultato. Se il primo personaggio è il criterio che desideri, è tutto. Se hai bisogno solo dei nomi dei file, puoi provare:

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

O qualcosa di simile (quel comando ordina e poi divide ogni riga usando il delimitatore di spazio, quindi restituisce il secondo gruppo.


grazie per la modifica di Tico, è difficile vedere cosa digiti al telefono.
Fabio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.