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.
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:
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
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
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$filefile "$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 duplicatidir/, che era solo un nome di esempio, dovrai cambiarla con il nome di una directory reale: for file in /home/alex/*; do ... donead esempio.
sort -urimuoveranno, le linee devono essere diverse (potrebbero anche avere un numero diverso di spazi, il che le rende non identiche).
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.
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
file -b *invece di ls | xargs file -b, per evitare l'analisi ls.