Come posso mostrare tutti i tipi di file contenuti in una directory?


12

Esiste un comando che mi dice nella directory specifica quali tipi di file esistono?

Posso scoprire il tipo di file usando un comando come od -c myfile | less.

Ma non so come farlo per tutti i file in una directory.

Risposte:


19

Sebbene od -cmostrerà effettivamente il contenuto di un file, non è un buon modo per ottenere il suo tipo di file. Mentre alcuni file conterranno un'intestazione con il tipo di file, non tutti lo faranno. Un modo migliore è il comando file:

$ echo "hello" > foo.txt
$ file foo.txt
foo.txt: ASCII text

Quindi, per ottenere un elenco di tutti i tipi di file in una directory, puoi fare:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

Esempio di output:

 PNG image data, 1500 x 500, 8-bit/color RGBA, non-interlaced
 ASCII text
 directory
 GIF image data, version 89a, 22 x 22
 ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=becf821e4d814fdb69306d0b3f686eb06992f5e5, stripped

Spiegazione

  • for file in dir/*; do ... done;: iterare tutto in dir( dirè solo un esempio, dovresti cambiarlo con il nome della directory attuale in cui vuoi cercare), salvando ogni elemento a turno come$file
  • file "$file": esegui filesu ciascuno degli elementi trovati.
  • cut -d: -f 2: stampa solo il secondo campo (campi definiti da :)
  • sed 's/^ //; s/ +/ /g' : rimuove gli spazi dall'inizio della linea e converte gli spazi consecutivi in ​​un singolo spazio.
  • sort -u : rimuove i tipi di file duplicati

grazie, ma ho esattamente copiato e passato "per il file in dir / *; esegui il file" $ file "| cut -d: -f 2 | sort -u; done" nel mio terminale e ho ottenuto "ERRORE"
Mohammad Reza Rezwani

2
@alex prima di tutto, menziona sempre l'errore esatto che ricevi, dicendo che hai ottenuto "ERRORE" non è molto utile. In ogni caso, l'errore è probabilmente dovuto al fatto che non hai una directory chiamata dir/, che era solo un nome di esempio, dovrai cambiarla con il nome di una directory reale: for file in /home/alex/*; do ... donead esempio.
terdon,

grazie, se hai fatto il mio lavoro sbagliato (... pensavo che dir fosse il comando come se non directory -sorry- penso anche meglio modificare la tua risposta) Vedi solo "ERRORE" e nient'altro.
Mohammad Reza Rezwani,

bel lavoro, grazie, ma ho visto ad esempio quattro righe "File audio con ID3 versione 2.3.0, contiene" o più di un "supporto ISO, sistema MPEG v4, versione 2". Non sono sicuro di "rimuovere i duplicati".
Mohammad Reza Rezwani,

@alex abbastanza equo, risposta modificata. Non dovresti ricevere duplicati. Le sort -urimuoveranno, le linee devono essere diverse (potrebbero anche avere un numero diverso di spazi, il che le rende non identiche).
terdon,

3

Probabilmente farei qualcosa del genere -

find . -type f -exec file {}  \;

Che cercherà dal percorso corrente, i file (es. Nessuna directory) e quindi eseguirà il filecomando su ciascun file.


1

Prova questo:

ls | xargs file -b | sort | uniq

Come funziona:

ls : elenca i contenuti della directory

file -b : determina il tipo di file; non anteporre nomi di file alle righe di output

ordina : ordina le linee

uniq : omette le righe ripetute



1
È possibile utilizzare file -b *invece di ls | xargs file -b, per evitare l'analisi ls.
wjandrea,
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.