list / encontrar todos os arquivos regulares em todos os subdiretórios, exceto arquivos binários

5

No Linux.

Eu sei que posso fazer find . -type f , mas isso inclui arquivo binário e não consegui encontrar uma maneira de excluí-los com o find

    
por Samer Buna 05.10.2010 / 02:16

6 respostas

7

file /usr/bin/file , por exemplo, não inclui a palavra "binary" em sua saída no meu sistema. Se file -i estiver disponível, incluirá a palavra "binário". Sem -i , pode ser mais confiável testar a presença da palavra "texto".

find -type f -exec sh -c "file {} | grep text >/dev/null" \; -print

ou

find -type f -exec sh -c "file {} | grep text >/dev/null" \; -ls

Usando -i :

find -type f -exec sh -c "file -i {} | grep -v binary >/dev/null" \; -print

Usar file será apenas uma aproximação, pois está usando heurística para determinar o tipo de arquivo e não há uma definição rápida e exata do que constitui um arquivo "binário". Um arquivo vazio é "binário"? file diz que é. Além disso, há muitas maneiras (normalmente incomuns) de acionar IDs falsos positivos em file .

    
por 05.10.2010 / 03:13
3

Outra maneira seria excluir todos os arquivos com permissão de execução configurada para usuário, grupo ou outros:

find . -type f ! -perm /u=x,g=x,o=x

(Se o binário for igual a permissões de execução ...)

    
por 05.10.2010 / 02:47
0

mostre todos os arquivos sem permissões executáveis (embora isto não seja especificamente binário, então pode não ser exatamente o que você precisa):

ls -l | awk '{if ($1 !~ /x/) print $8}'
    
por 05.10.2010 / 02:24
0

Exemplo usando Python e shell:

IS_BINARY='import sys; sys.exit(not b"\x00" in open(sys.argv[1], "rb").read())'
find . -type f -exec bash -c "python -c '$IS_BINARY' {} || echo {}" \;

O elemento-chave está em:

b"\x00" in open("foo.bar", "rb").read()

que verifica se o arquivo tem caractere NULL .

    
por 01.06.2015 / 23:27
0

Tente o seguinte comando:

find . -type f -exec file "{}" \; | grep -vE "ELF|archive"
    
por 05.10.2010 / 03:01
0

Se você quer dizer arquivos regulares que basicamente não contêm caracteres NULL , tente usar o GNU grep :

grep -PaLr '\x00' .
    
por 01.06.2015 / 23:38

Tags