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.