Como faço para exibir o tipo de arquivo com ls?

8

Eu sou ignorante se ls é capaz de exibir uma coluna de tipo de arquivo.

Realizar uma pesquisa on-line rápida e pesquisar o man não revelou essa capacidade. É capaz de fazer isso?

Esclarecimento: Isso é especialmente útil se os arquivos não tiverem uma extensão.

Atualizar

A partir de 2018-04-28 as respostas foram bastante interessantes, mas não forneceram o que eu estava procurando. Mais especificamente,

  • file fornece os tipos de arquivos reais, mas não se integra bem a ls . Especificamente, eu uso ls -lhtrpG --group-directories-first --color=always

  • ls -F é uma solução ls , no entanto, fornece símbolos que não são uma coluna de tipos de arquivos reais.

Por esse motivo, não marquei nenhuma das respostas como a resposta que estou procurando.

    
por user10853 26.04.2018 / 20:52

4 respostas

11

file é definitivamente a escolha certa para obter as informações de tipo de arquivo desejadas. Para combinar sua saída com a de ls , sugiro usar find :

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

Isso encontra todos os arquivos no diretório atual e imprime a saída de ls -dils , bem como a saída de file -b , cada um em uma linha própria. Exemplo de saída:

  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

Mas, como você não quer um tipo de arquivo linha , mas uma coluna de tipo de arquivo , aqui está uma maneira de se livrar do caractere de nova linha entre as linhas:

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

Exemplo de saída:

-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

Essa nova coluna é bem longa, então vamos cortar tudo da primeira vírgula:

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

A saída disso é assim:

-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

Isso não é muito útil, então que tal um alias ? Com a seguinte linha no seu arquivo ~/.bash_aliases , você só precisa executar lsf para obter a saída acima para o diretório atual.

alias lsf='find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '"'\n'"' '"'\t'"'; file -b {} | cut -d, -f1" \;'
    
por dessert 26.04.2018 / 22:27
7

Para maior clareza, vou salientar que você pode ver o tipo de arquivo em um sentido básico com ls , usando o -F flag (classify), que acrescenta um símbolo ao nome do arquivo, dependendo do 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.

Você pode ver essa informação um pouco menos enigmaticamente exibida na primeira letra da saída de ls -l , no entanto. a resposta de wjandrea descreve isso com mais detalhes.

Mas eu não acho que isso é o que você quer dizer com tipo de arquivo. O comando ls não procura dentro de arquivos regulares - apenas em listagens de diretórios (que armazenam nomes de arquivos) e inodes (que armazenam metadados, incluindo o "tipo" no sentido mencionado anteriormente).

Portanto, o comando ls não pode mostrar o tipo de arquivo no sentido de ser uma imagem JPG ou um arquivo binário ou um arquivo de texto ou um documento do LibreOffice de algum tipo, porque ele não tem essa informação. / p>

Para isso, como a resposta do singrium indica, você precisa do comando file , que examina os primeiros 50 -100kB ou mais de conteúdo dos arquivos para determinar seu tipo.

    
por Zanna 26.04.2018 / 22:13
6

Acho que a melhor maneira de exibir um tipo de arquivo é usando este comando:

file <filename>

Se você quiser listar os tipos de todos os arquivos em um diretório, use:

file *

Para mais detalhes sobre os argumentos, consulte:

man file
    
por singrium 26.04.2018 / 21:01
3

Uma forma de tipo de arquivo é se um arquivo é um arquivo, diretório, dispositivo, link simbólico, etc. ls pode mostrar isso usando as opções -l ou -F .

  • A opção -l mostrará o tipo de arquivo como um único caractere no início de uma listagem, por exemplo:

    $ 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
    

    Onde - é um arquivo normal, d é um diretório e l é um link simbólico.

  • A opção -F mostrará o tipo de arquivo como um sufixo, por exemplo:

    $ ls -F
    DIR/ FILE LINK@
    

    Onde nenhum sufixo é um arquivo normal, / é um diretório e @ é um link simbólico.

Mais informações sobre isso estão disponíveis em info coreutils 'ls invocation' , resumido aqui:

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
    
por wjandrea 26.04.2018 / 22:44