Come visualizzo il tipo di file con ls?


12

Sono ignaro del fatto che lssia in grado di visualizzare una colonna di tipo di file.

Fare una rapida ricerca online e cercare il mannon ha rivelato tale capacità. È in grado di farlo?

Chiarimento: questo è particolarmente utile se i file non hanno estensione.

Aggiornare

A partire dal 28-04-2018 le risposte sono state piuttosto interessanti, tuttavia non hanno fornito ciò che stavo cercando. Più specificamente,

  • filefornisce i tipi di file effettivi ma non si integra bene con ls. In particolare, io usols -lhtrpG --group-directories-first --color=always

  • ls -Fè una lssoluzione tuttavia fornisce simboli non una colonna di tipi di file effettivi.

Per questo motivo non ho contrassegnato nessuna delle risposte come la risposta che sto cercando.



informazioni correlate: per lettura umana: ls -lahtrpF --group-directories-first --color=always /devo ls -lsahG /dev, e per lettura programma ls -lsa /dev. vedere la man lsdocumentazione per i dettagli.
— user1742529

Risposte:


16

fileè sicuramente la scelta giusta per ottenere le informazioni sul tipo di file che desideri. Per combinare il suo output con quello di lsio suggerisco di usare find:

find -maxdepth 1 -type f -ls -exec file -b {} \;

Questo trova tutti i file nella directory corrente e stampa l'output ls -dilse l'output di file -bper esso, ognuno su una propria riga. Esempio di output:

  2757145      4 -rw-rw-r--   1 dessert dessert      914 Apr 26 14:02 ./some.html
HTML document, ASCII text
  2757135      4 -rw-rw-r--   1 dessert dessert      201 Apr 13 15:26 ./a_text_file
UTF-8 Unicode text, with CRLF, LF line terminators

Ma, poiché non si desidera una riga del tipo di file ma piuttosto una colonna del tipo di file , ecco un modo per sbarazzarsi del carattere di nuova riga tra le righe:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {}" \;

Uscita campione:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document, ASCII text
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text, with CRLF, LF line terminators

Quella nuova colonna è piuttosto lunga, quindi tagliamo tutto dalla prima virgola:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {} | cut -d, -f1" \;

L'output di questo è simile al seguente:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text

Questo non è abbastanza utile, quindi che ne dici di un alias? Con la seguente riga nel tuo ~/.bash_aliasesfile devi solo eseguire lsfper ottenere l'output sopra per la directory corrente.

alias lsf='find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '"'\n'"' '"'\t'"'; file -b {} | cut -d, -f1" \;'

1
Se usi una funzione invece di un alias, sarà meno un inferno quotativo, e se usi pasteo column, potresti ottenere un migliore allineamento: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }il problema di allineamento non è evidente nella risposta a causa di dimensioni e date simili. (Anche questo sarà leggermente più veloce, poiché i comandi verranno invocati meno volte anziché una volta per file.)
— muru,

@muru Grazie per i tanti buoni suggerimenti! Questo columnapproccio funziona per te? Stampa solo l'output di ls -lper ogni file seguito filedall'output di ogni file per me, come se la shell potesse semplicemente fare ls -l "$@"; file -b "$@" | cut -d, -f1...
— dessert

Lo fa. paste.ubuntu.com/p/KjPthXPDPb - la parte superiore proviene dall'alias e la parte inferiore è la funzione, entrambe eseguite da /etc.
— muru,

Penso di vedere il problema - se columnl'output non è per il terminale, è necessario specificare il conteggio delle colonne o verranno emessi i file uno dopo l'altro; quindi column -c "$COLUMNS" ...dovrebbe funzionare in entrambi i casi.
— muru,

Stai avviando (almeno?) 5 processi per ogni file, quindi probabilmente sarà lento quando ci sono molti file in una directory ...
— JanC

10

Penso che il modo migliore per visualizzare un tipo di file sia usare questo comando:

file <filename>

Se vuoi elencare i tipi di tutti i file in una directory, usa semplicemente:

file *

Esempio di <code> file * </code> dal mio computer

Per maggiori dettagli sugli argomenti, vedere:

man file

Sebbene questa risposta non risponda direttamente alla domanda del PO, mostra il modo corretto di trovare il tipo mime di un file e deve essere contrassegnata come risposta corretta. Per ottenere l' mime typeunico, uso: file --mime-type filename.
— Pedro Lobito,

@PedroLobito Penso che la domanda strettamente correlata copra fileabbastanza bene, ma questa domanda è diversa.
— dessert

Voto questa risposta dato che sei stato il primo a dare una filerisposta. Come ho risposto agli altri, questo non è sufficiente (deve essere integrato con ls), quindi lo tengo al voto. Grazie.
— user10853

1
file * è la risposta migliore
— tramada il

1
file --mime /dev/*per la lista mimi nella directory / dev anziché corrente
— user1742529

7

Per chiarezza, ho intenzione di sottolineare che puoi vedere il tipo di file in un senso di base con ls, usando il -Fflag (classificare) che aggiunge un simbolo al nome del file in base al suo tipo:

‘-F’
‘--classify’
‘--indicator-style=classify’
     Append a character to each file name indicating the file type.
     Also, for regular files that are executable, append ‘*’.  The file
     type indicators are ‘/’ for directories, ‘@’ for symbolic links,
     ‘|’ for FIFOs, ‘=’ for sockets, ‘>’ for doors, and nothing for
     regular files.

ls -lTuttavia, puoi vedere che le informazioni sono visualizzate in modo leggermente meno crittografico nella prima lettera dell'output di . La risposta di wjandrea lo descrive in modo più dettagliato.

Ma non penso che questo sia ciò che intendi per tipo di file. Il lscomando non esamina i normali file, ma solo gli elenchi di directory (che memorizzano i nomi dei file) e gli inode (che memorizzano i metadati, incluso il "tipo" nel senso menzionato in precedenza).

Quindi, il lscomando non può mostrare il tipo di file nel senso che si tratti di un'immagine JPG o di un file binario o di un file di testo o di un documento di LibreOffice di qualche tipo, perché non ha tali informazioni.

Per questo, come sottolinea la risposta di Singrium , è necessario il filecomando, che esamina i primi 50-100 kB circa dei contenuti dei file per determinarne il tipo.


@Zana Grazie per aver sollevato la mia attenzione su questa bandiera. Questo per ora lo farebbe anche se non è quello che stavo cercando (tipi di file effettivi). Per questo lo voterò.
— user10853

3

Una forma di tipo di file è se un file è un normale file, directory, dispositivo, collegamento simbolico, ecc. lsPuò mostrarlo usando le opzioni -lo -F.

  • L'opzione -lmostrerà il tipo di file come un singolo carattere all'inizio di un elenco, ad esempio:

    $ ls -l
    drwxrwxr-x 2 user user 4096 Dec 11 00:18 DIR
    -rw-rw-r-- 1 user user    0 Dec 11 00:18 FILE
    lrwxrwxrwx 1 user user    4 Dec 11 00:19 LINK -> FILE
    

    Dove si -trova un file normale, dè una directory ed lè un collegamento simbolico.

  • L'opzione -Fmostrerà il tipo di file come suffisso, ad esempio:

    $ ls -F
    DIR/ FILE LINK@
    

    Dove nessun suffisso è un file normale, /è una directory ed @è un collegamento simbolico.

Maggiori informazioni su questi sono disponibili in info coreutils 'ls invocation', riassunti qui:

Per -l:

‘-’ regular file
‘b’ block special file
‘c’ character special file
‘C’ high performance (“contiguous data”) file
‘d’ directory
‘D’ door (Solaris 2.5 and up)
‘l’ symbolic link
‘M’ off-line (“migrated”) file (Cray DMF)
‘n’ network special file (HP-UX)
‘p’ FIFO (named pipe)
‘P’ port (Solaris 10 and up)
‘s’ socket
‘?’ some other file type

Per -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
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.