¿Cómo visualizo el tipo de archivo con ls?

12

No sé si lses capaz de mostrar una columna de tipo de archivo.

Hacer una búsqueda rápida en línea y buscar en el manno reveló tal capacidad. ¿Es capaz de hacer esto?

Aclaración: Esto es especialmente útil si los archivos no tienen una extensión.

Actualizar

A partir del 28/04/2018, las respuestas han sido bastante interesantes, sin embargo, no proporcionaron lo que estaba buscando. Más específicamente,

  • fileda los tipos de archivo reales pero no se integra bien con ellos ls. Específicamente, yo usols -lhtrpG --group-directories-first --color=always

  • ls -Fes una lssolución, sin embargo, proporciona símbolos, no una columna de tipos de archivo reales.

Por esta razón, no he marcado ninguna de las respuestas como la respuesta que estoy buscando.

usuario10853
fuente
información relacionada: para lectura humana: ls -lahtrpF --group-directories-first --color=always /devo ls -lsahG /dev, y para lectura de programa ls -lsa /dev. ver man lsdocumentación para más detalles.
user1742529

Respuestas:

16

filedefinitivamente es la opción correcta para obtener la información del tipo de archivo que desea. Para combinar su salida con la de lssugiero usar find:

find -maxdepth 1 -type f -ls -exec file -b {} \;

Esto encuentra todos los archivos en el directorio actual e imprime la salida ls -dilsy la salida de file -bcada uno en una línea propia. Salida de ejemplo:

  2757145      4 -rw-rw-r--   1 dessert dessert      914 Apr 26 14:02 ./some.html
HTML document, ASCII text
  2757135      4 -rw-rw-r--   1 dessert dessert      201 Apr 13 15:26 ./a_text_file
UTF-8 Unicode text, with CRLF, LF line terminators

Pero, como no desea una línea de tipo de archivo , sino una columna de tipo de archivo , aquí hay una manera de deshacerse del carácter de nueva línea entre las líneas:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {}" \;

Salida de muestra:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document, ASCII text
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text, with CRLF, LF line terminators

Esa nueva columna es bastante larga, así que vamos a cortar todo desde la primera coma:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {} | cut -d, -f1" \;

La salida de eso se ve así:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text

Esto no es muy útil, así que ¿qué tal un alias? Con la siguiente línea en su ~/.bash_aliasesarchivo solo necesita ejecutar lsfpara obtener el resultado anterior para el directorio actual.

alias lsf='find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '"'\n'"' '"'\t'"'; file -b {} | cut -d, -f1" \;'
postre
fuente
1
Si usa una función en lugar de un alias, será menos complicado, y si usa pasteo column, podría obtener una mejor alineación: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }el problema de alineación no es evidente en la respuesta debido a los tamaños y fechas similares. (Esto también será un poco más rápido, ya que los comandos se invocarán menos veces en lugar de una vez por archivo.)
muru
@muru ¡Gracias por las muchas buenas sugerencias! ¿Este columnenfoque funciona para usted? Simplemente imprime la salida de ls -lcada archivo seguido de filela salida de cada archivo para mí, como si el shell simplemente hiciera ls -l "$@"; file -b "$@" | cut -d, -f1...
postre
Lo hace. paste.ubuntu.com/p/KjPthXPDPb : la parte superior es del alias y la parte inferior es la función, ambas se ejecutan desde /etc.
muru
Creo que veo el problema: si columnla salida no está en el terminal, debe especificar el recuento de columnas o los archivos se mostrarán uno tras otro; entonces column -c "$COLUMNS" ...debería funcionar en cualquier caso.
muru
Está iniciando (¿al menos?) 5 procesos para cada archivo, por lo que esto probablemente será lento cuando haya muchos archivos en un directorio ...
JanC
10

Creo que la mejor manera de mostrar un tipo de archivo es usar este comando:

file <filename>

Si desea enumerar los tipos de todos los archivos en un directorio, simplemente use:

file *

<code> archivo * </code> muestra de mi computadora

Para obtener más detalles sobre los argumentos, consulte:

man file
Singrium
fuente
Si bien esta respuesta no responde directamente a la pregunta del OP, muestra la forma correcta de encontrar el tipo MIME de un archivo y debe marcarse como la respuesta correcta. Para obtener la mime typeúnica, utilice: file --mime-type filename.
Pedro Lobito
@PedroLobito Creo que la pregunta estrechamente relacionada cubre filebastante bien, pero esta pregunta es diferente.
postre
Voto esta respuesta dado que fuiste el primero en dar una filerespuesta. Como respondí a los demás, esto no es suficiente (debe integrarse con ls), así que lo mantengo en una votación. Gracias.
user10853
1
archivo * es la mejor respuesta
tramada
1
file --mime /dev/*para listar mimos en el directorio / dev en lugar de actual
user1742529
7

Para mayor claridad, voy a señalar que puede ver el tipo de archivo en un sentido básico con ls, usando la -Fbandera (clasificar) que agrega un símbolo al nombre de archivo dependiendo de su tipo:

‘-F’
‘--classify’
‘--indicator-style=classify’
     Append a character to each file name indicating the file type.
     Also, for regular files that are executable, append ‘*’.  The file
     type indicators are ‘/’ for directories, ‘@’ for symbolic links,
     ‘|’ for FIFOs, ‘=’ for sockets, ‘>’ for doors, and nothing for
     regular files.

Sin ls -lembargo, puede ver esa información un poco menos crípticamente mostrada en la primera letra de la salida de . La respuesta de wjandrea describe esto con más detalle.

Pero no creo que esto sea lo que quiere decir con tipo de archivo. El lscomando no busca dentro de los archivos normales, solo en las listas de directorios (que almacenan nombres de archivos) e inodes (que almacenan metadatos, incluido el "tipo" en el sentido mencionado anteriormente).

Entonces, el lscomando no puede mostrar el tipo de archivo en el sentido de si es una imagen JPG o un archivo binario o un archivo de texto o un documento de LibreOffice de algún tipo, porque no tiene esa información.

Para eso, como señala la respuesta de singrium , necesita el filecomando, que analiza los primeros 50-100kB más o menos del contenido de los archivos para determinar su tipo.

Zanna
fuente
@Zana Gracias por llamar mi atención sobre esta bandera. Esto lo haría por ahora, aunque no es lo que estaba buscando (tipos de archivo reales). Por esto lo votaré.
user10853
3

Una forma de tipo de archivo es si un archivo es un archivo normal, un directorio, dispositivo, enlace simbólico, etc. lspuede mostrar esto usando las opciones -lo -F.

  • La opción -lmostrará el tipo de archivo como un solo carácter al comienzo de una lista, por ejemplo:

    $ ls -l
    drwxrwxr-x 2 user user 4096 Dec 11 00:18 DIR
    -rw-rw-r-- 1 user user    0 Dec 11 00:18 FILE
    lrwxrwxrwx 1 user user    4 Dec 11 00:19 LINK -> FILE
    

    Donde -es un archivo normal, des un directorio y les un enlace simbólico.

  • La opción -Fmostrará el tipo de archivo como un sufijo, por ejemplo:

    $ ls -F
    DIR/ FILE LINK@
    

    Donde ningún sufijo es un archivo normal, /es un directorio y @es un enlace simbólico.

Más información sobre estos está disponible en info coreutils 'ls invocation', resumido aquí:

Para -l:

‘-’ regular file
‘b’ block special file
‘c’ character special file
‘C’ high performance (“contiguous data”) file
‘d’ directory
‘D’ door (Solaris 2.5 and up)
‘l’ symbolic link
‘M’ off-line (“migrated”) file (Cray DMF)
‘n’ network special file (HP-UX)
‘p’ FIFO (named pipe)
‘P’ port (Solaris 10 and up)
‘s’ socket
‘?’ some other file type

Para -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
wjandrea
fuente