Como posso mostrar todos os tipos de arquivos contidos em um diretório?

12

Existe algum comando que me diga no diretório específico que tipos de arquivos existem?

Eu posso descobrir o tipo de arquivo usando um comando como od -c myfile | less.

Mas não sei como fazer isso para todos os arquivos em um diretório.

Mohammad Reza Rezwani
fonte

Respostas:

19

Embora od -crealmente mostre o conteúdo de um arquivo, não é uma boa maneira de obter seu tipo de arquivo. Enquanto alguns arquivos conterão um cabeçalho com o tipo de arquivo, nem todos conterão. Uma maneira melhor é o comando file:

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

Portanto, para obter uma lista de todos os tipos de arquivo em um diretório, você pode:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

Exemplo de saída:

 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

Explicação

  • for file in dir/*; do ... done;: repita tudo em dir( diré apenas um exemplo, você deve alterar isso para o nome do diretório real pelo qual deseja pesquisar), salvando cada item por vez$file
  • file "$file": executado fileem cada um dos itens encontrados.
  • cut -d: -f 2: imprime apenas o segundo campo (campos definidos por :)
  • sed 's/^ //; s/ +/ /g' : remova espaços do início da linha e converta espaços consecutivos em um único espaço.
  • sort -u : remover tipos de arquivo duplicados
Terdon
fonte
obrigado, Mas eu copio e colo exatamente "para o arquivo em dir / *; do arquivo" $ file "| cut -d: -f 2 | sort -u; done" no meu terminal e recebi "ERRO"
Mohammad Reza Rezwani
2
@ alex em primeiro lugar, sempre mencione o erro exato que você recebe, dizendo que você recebeu "ERRO" não é muito útil. De qualquer forma, o erro provavelmente se deve ao fato de você não ter um diretório chamado dir/, que era apenas um nome de exemplo; será necessário alterá-lo para o nome de um diretório real: for file in /home/alex/*; do ... donepor exemplo.
terdon
obrigado, Se você fez meu trabalho errado (... eu pensei que dir é um comando como se não fosse o diretório - desculpe- também acho melhor editar sua resposta) Você acabou de ver "ERRO" e nada mais.
Mohammad Reza Rezwani
bom trabalho, thnaks, mas vi por exemplo quatro linhas "Arquivo de áudio com ID3 versão 2.3.0, contém" ou mais de "ISO Media, sistema MPEG v4, versão 2". Não tenho certeza sobre "remover duplicado".
Mohammad Reza Rezwani
@alex justo o suficiente, resposta editada. Você não deve receber duplicatas. Os sort -uremoverão, as linhas devem ser diferentes (elas também podem ter um número diferente de espaços, o que as torna não idênticas).
terdon
3

Eu provavelmente faria algo assim -

find . -type f -exec file {}  \;

Isso pesquisará no caminho atual, arquivos (por exemplo, nenhum diretório) e, em seguida, executará o filecomando em cada arquivo.

Elliott Frisch
fonte
1

Tente o seguinte:

ls | xargs file -b | sort | uniq

Como funciona:

ls : lista o conteúdo do diretório

arquivo -b : determina o tipo de arquivo; não acrescente nomes de arquivos às linhas de saída

sort : classificar linhas

uniq : omite linhas repetidas

Wolfy
fonte
1
Você pode usar em file -b *vez de ls | xargs file -b, para evitar a análise ls.
Wjandrea