enumerar / encontrar todos los archivos regulares en todos los subdirectorios, excepto los archivos binarios

5

En Linux

Sé que puedo hacerlo find . -type f, pero eso incluye un archivo binario y no pude encontrar una manera de excluirlos con find

Samer Buna
fuente
1
¿Qué constituye "binario"? Todos los archivos son binarios cuando te pones a ello.
Billy ONeal

Respuestas:

7

file /usr/bin/file, por ejemplo, no incluye la palabra "binario" en su salida en mi sistema. Si file -iestá disponible, incluye la palabra "binario". Sin esto -i, puede ser más confiable probar la presencia de la palabra "texto".

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

o

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

Utilizando -i:

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

Usar filesolo será una aproximación, ya que está usando la heurística para determinar el tipo de archivo y no existe una definición rápida de lo que constituye un archivo "binario". ¿Es un archivo vacío "binario"? filedice que es. Además, hay muchas formas (normalmente poco comunes) de activar identificaciones falsas positivas file.

Dennis Williamson
fuente
3

Otra forma sería excluir todos los archivos que tienen permisos de ejecución establecidos para usuarios, grupos u otros:

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

(Si binario es igual a ejecutar permisos ...)

phoibos
fuente
0

muestra todos los archivos sin permisos ejecutables (aunque esto no es específicamente binario, por lo que puede que no sea exactamente lo que necesita):

ls -l | awk '{if ($1 !~ /x/) print $8}'
MaQleod
fuente
2
Pensé en algo similar, pero me preocupaba que el ejecutable! = Binario. Sin embargo, también puede hacer esto con find:find . -type f \! -executable
Telemachus
0

Ejemplo usando Python y 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 {}" \;

El elemento clave está en:

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

que comprueba si el archivo tiene carácter NULL .

kenorb
fuente
0

Pruebe el siguiente comando:

find . -type f -exec file "{}" \; | grep -vE "ELF|archive"
usuario31894
fuente
Es posible que necesite \;después "{}".
Dilawar
0

Si te refieres a archivos normales que básicamente no contienen caracteres NULL , intenta usar GNU grep:

grep -PaLr '\x00' .
kenorb
fuente