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:
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.
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.
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 ... done
por exemplo.sort -u
removerã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).Eu provavelmente faria algo assim -
Isso pesquisará no caminho atual, arquivos (por exemplo, nenhum diretório) e, em seguida, executará o
file
comando em cada arquivo.fonte
Tente o seguinte:
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
fonte
ls
file -b *
vez dels | xargs file -b
, para evitar a análisels
.