¿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.
¿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.
Respuestas:
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
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;: 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$filefile "$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 duplicadosdir/, ese era solo un nombre de ejemplo, tendrá que cambiarlo al nombre de un directorio real: for file in /home/alex/*; do ... donepor ejemplo.
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).
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.
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
file -b *lugar de ls | xargs file -b, para evitar el análisis ls.