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


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.


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 ...)


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}'

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 .


0

Pruebe el siguiente comando:

find . -type f -exec file "{}" \; | grep -vE "ELF|archive"

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' .
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.