Aunque de od -checho mostrará el contenido de un archivo, no es una buena forma de obtener su tipo de archivo. Si bien algunos archivos contendrán un encabezado con el tipo de archivo, no todos lo harán. Una mejor manera es el comando file:
Entonces, para obtener una lista de todos los tipos de archivos en un directorio, puede hacer:
for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u
Salida de ejemplo:
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
Explicación
for file in dir/*; do ... done;: iterar a través de todo en dir( dires solo un ejemplo, debe cambiar esto al nombre del directorio real que desea buscar), guardando cada elemento a su vez como$file
file "$file": ejecutar fileen cada uno de los elementos encontrados.
cut -d: -f 2: imprime solo el segundo campo (campos definidos por :)
sed 's/^ //; s/ +/ /g' : elimina espacios desde el principio de la línea y convierte espacios consecutivos en un solo espacio.
@alex antes que nada, siempre menciona el error exacto que obtienes, diciendo que tienes "ERROR" no es muy útil. En cualquier caso, el error probablemente se deba a que no tiene un directorio nombrado dir/, ese era solo un nombre de ejemplo, tendrá que cambiarlo al nombre de un directorio real: for file in /home/alex/*; do ... donepor ejemplo.
terdon
gracias, si hiciste mi trabajo incorrecto (... pensé que dir es un comando como ls not directory -sorry- también creo que es mejor editar tu respuesta) Simplemente ves "ERROR" y nada más.
Mohammad Reza Rezwani
buen trabajo, gracias, pero vi, por ejemplo, cuatro líneas "Archivo de audio con ID3 versión 2.3.0, contiene" o más de un "Medio ISO, sistema MPEG v4, versión 2". No estoy seguro acerca de "eliminar duplicados".
Mohammad Reza Rezwani
@alex lo suficientemente justo, respuesta editada. No deberías recibir ningún duplicado. Los sort -ueliminará, las líneas deben ser diferentes (también pueden tener un número diferente de espacios, lo que las hace no idénticas).
terdon
3
Probablemente haría algo como esto:
find . -type f -exec file {} \;
Eso buscará desde la ruta actual, archivos (por ejemplo, sin directorios) y luego ejecutará el filecomando en cada archivo.
dir/
, ese era solo un nombre de ejemplo, tendrá que cambiarlo al nombre de un directorio real:for file in /home/alex/*; do ... done
por ejemplo.sort -u
eliminará, las líneas deben ser diferentes (también pueden tener un número diferente de espacios, lo que las hace no idénticas).Probablemente haría algo como esto:
Eso buscará desde la ruta actual, archivos (por ejemplo, sin directorios) y luego ejecutará el
file
comando en cada archivo.fuente
Prueba esto:
Cómo funciona:
ls : enumera el contenido del directorio
archivo -b : determina el tipo de archivo; no anteponga nombres de archivo a líneas de salida
ordenar : ordenar líneas
uniq : omite líneas repetidas
fuente
ls
file -b *
lugar dels | xargs file -b
, para evitar el análisisls
.