¿Cómo puedo mostrar todos los tipos de archivos contenidos en un directorio?

12

¿Hay algún comando que me indique en el directorio específico qué tipos de archivos existen?

Puedo encontrar el tipo de archivo usando un comando como od -c myfile | less.

Pero no sé cómo hacerlo para todos los archivos en un directorio.

Mohammad Reza Rezwani
fuente

Respuestas:

19

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:

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

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.
  • sort -u : eliminar tipos de archivos duplicados
terdon
fuente
gracias, pero
copié y pegué
2
@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.

Elliott Frisch
fuente
1

Prueba esto:

ls | xargs file -b | sort | uniq

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

Wolfy
fuente
1
Puede usar en file -b *lugar de ls | xargs file -b, para evitar el análisis ls.
wjandrea