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.
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.
Respostas:
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
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;: 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$filefile "$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 duplicadosdir/, 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.
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).
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.
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
file -b *vez de ls | xargs file -b, para evitar a análise ls.