Sé que este es un hilo antiguo, pero me encontré con él y pensé en compartir mi método, que he descubierto que es una forma muy rápida de usar find
para encontrar solo archivos no binarios:
find . -type f -exec grep -Iq . {} \; -print
La -I
opción grep le dice que ignore inmediatamente los archivos binarios y la .
opción junto con -q
hará que coincida inmediatamente con los archivos de texto, por lo que va muy rápido. Puede cambiar el -print
a a -print0
para la tubería en un xargs -0
o algo si le preocupan los espacios (¡gracias por el consejo, @ lucas.werkmeister!)
Además, el primer punto solo es necesario para ciertas versiones de BSD find
, como en OS X, pero no hace daño tenerlo allí todo el tiempo si quieres ponerlo en un alias o algo así.
EDITAR : Como @ruslan señaló correctamente, -and
se puede omitir ya que está implícito.
find . -type f -exec grep -Il "" {} \;
.find -type f -exec grep -Iq . {} \; -and -print
que tiene la ventaja de que mantiene los archivosfind
; puede sustituirlo-print
por otro-exec
que solo se ejecute para archivos de texto. (Si dejagrep
imprimir los nombres de los archivos, no podrá distinguir los nombres de los archivos con nuevas líneas).find . -type f -exec grep -Il . {} +
es mucho más rápido. El inconveniente es que no se puede extender por otro-exec
como sugirió @ lucas.werkmeisterBasado en esta pregunta SO :
grep -rIl "needle text" my_folder
fuente
-I
es un salvavidas.¿Por qué es desagradable? Si necesita usarlo con frecuencia y no quiere escribirlo cada vez, simplemente defina una función bash para él:
ponlo en tu
.bashrc
y luego ejecuta:cuando quieras.
EDITAR para reflejar la edición de OP:
Si desea eliminar la información de mímica, puede simplemente agregar una etapa adicional a la tubería que filtra la información de mímica. Esto debería hacer el truco, tomando sólo lo que viene antes
:
:cut -d':' -f1
:fuente
file
manual: "Los usuarios dependen de saber que todos los archivos legibles en un directorio tienen impresa la palabra 'texto'"./proc/meminfo
,/proc/cpuinfo
etc. son archivos de texto, perofile /proc/meminfo
dice/proc/meminfo: empty
. Me pregunto si debería probarse 'vacío' además de 'texto', pero no estoy seguro de si también otros tipos podrían informar 'vacío'.Desafortunadamente, esto no es un ahorro de espacio. Poner esto en el script bash lo hace un poco más fácil.
Esto es espacio seguro:
fuente
text.bin
? 2. ¿Qué pasa si un nombre de archivo contiene un:
?Otra forma de hacer esto:
Si también quieres archivos vacíos:
fuente
Qué tal esto:
Si desea los nombres de archivo sin los tipos de archivo, simplemente agregue un
sed
filtro final .Puede filtrar los tipos de archivos innecesarios agregando más
-e 'type'
opciones al últimogrep
comando.EDITAR:
Si su
xargs
versión admite la-d
opción, los comandos anteriores se vuelven más simples:fuente
Así es como lo he hecho ...
1. haga un pequeño script para probar si un archivo es texto plano istext:
2. usa buscar como antes
fuente
== *"text"* ]]
?Tengo dos problemas con la respuesta de histumness:
Solo enumera archivos de texto. En realidad, no los busca según lo solicitado. Para buscar realmente, use
Genera un proceso grep para cada archivo, que es muy lento. Una mejor solución es entonces
o simplemente
Esto solo toma 0.2s en comparación con 4s para la solución anterior (2.5GB de datos / 7700 archivos), es decir, 20 veces más rápido .
Además, nadie citó a ag, Silver Searcher o ack-grep como alternativas. Si alguno de estos está disponible, son alternativas mucho mejores:
Como última nota, tenga cuidado con los falsos positivos (archivos binarios tomados como archivos de texto). Ya tuve un falso positivo usando grep / ag / ack, así que es mejor enumerar los archivos coincidentes primero antes de editar los archivos.
fuente
Aunque es una pregunta antigua, creo que esta información a continuación se sumará a la calidad de las respuestas aquí.
Al ignorar archivos con el bit ejecutable configurado, solo uso este comando:
Para evitar que entre de forma recursiva en otros directorios:
No es necesario que las tuberías mezclen muchos comandos, solo el poderoso comando de búsqueda simple .
Dicho esto, espero que esto sea útil para cualquiera.
fuente
Lo hago de esta manera: 1) dado que hay demasiados archivos (~ 30k) para buscar, genero la lista de archivos de texto diariamente para usar a través de crontab usando el siguiente comando:
2) crea una función en .bashrc:
Entonces puedo usar el siguiente comando para hacer la búsqueda:
HTH :)
fuente
Yo prefiero xargs
si sus nombres de archivo son raros, busque usando las opciones -0:
fuente
grep eth0 $ (buscar / etc / -type f -exec file {} \; | egrep -i "text | ascii" | cut -d ':' -f1)
fuente
Aquí hay una versión simplificada con una explicación extendida para principiantes como yo que están tratando de aprender a poner más de un comando en una línea.
Si tuviera que escribir el problema en pasos, se vería así:
Para lograr esto, podemos utilizar tres comandos UNIX:
find
,file
, ygrep
.find
comprobará todos los archivos del directorio.file
nos dará el tipo de archivo. En nuestro caso, estamos buscando un retorno de 'texto ASCII'grep
buscará la palabra clave 'ASCII' en la salida defile
Entonces, ¿cómo podemos unirlos en una sola línea? Hay varias formas de hacerlo, pero creo que hacerlo en el orden de nuestro pseudocódigo tiene más sentido (especialmente para un principiante como yo).
find ./ -exec file {} ";" | grep 'ASCII'
Parece complicado, pero no está mal cuando lo desglosamos:
find ./
= revise todos los archivos de este directorio. Elfind
comando imprime el nombre de archivo de cualquier archivo que coincida con la 'expresión', o lo que venga después de la ruta, que en nuestro caso es el directorio actual o./
Lo más importante que debe comprender es que todo lo que esté después del primer bit se evaluará como Verdadero o Falso. Si es True, se imprimirá el nombre del archivo. Si no es así, el comando sigue adelante.
-exec
= esta bandera es una opción dentro del comando de búsqueda que nos permite usar el resultado de algún otro comando como expresión de búsqueda. Es como llamar a una función dentro de una función.file {}
= el comando que se llama dentro defind
. Elfile
comando devuelve una cadena que le indica el tipo de archivo de un archivo. Regularmente, se vería así:file mytextfile.txt
. En nuestro caso, queremos que use cualquier archivo que esté siendo examinado por elfind
comando, por lo que colocamos las llaves{}
para que actúe como una variable vacía o parámetro. En otras palabras, solo estamos pidiendo que el sistema genere una cadena para cada archivo en el directorio.";"
= esto es requerido porfind
y es el signo de puntuación al final de nuestro-exec
comando. Consulte el manual de 'buscar' para obtener más explicaciones si lo necesita ejecutándoloman find
.| grep 'ASCII'
=|
es una pipa. Pipe toma la salida de lo que está a la izquierda y la usa como entrada para lo que está a la derecha. Toma la salida delfind
comando (una cadena que es el tipo de archivo de un solo archivo) y la prueba para ver si contiene la cadena'ASCII'
. Si lo hace, devuelve verdadero.AHORA, la expresión a la derecha de
find ./
devolverá verdadero cuando elgrep
comando devuelva verdadero. Voila.fuente
Si está interesado en encontrar cualquier tipo de archivo por sus bytes mágicos usando la increíble
file
utilidad combinada con el poder defind
, esto puede ser útil:Salida:
Leyenda:
$
es el indicador de shell interactivo donde ingresamos nuestros comandosPuede modificar la parte posterior
&&
para llamar a otro script o hacer otras cosas en línea también, es decir, si ese archivo contiene una cadena determinada, seleccione el archivo completo o busque una cadena secundaria en él.Explicación:
find
elementos que son archivosxargs
cada elemento se alimente como una línea en unbash
comando / script de líneafile
verifica el tipo de archivo por byte mágico,grep
verifica si existe ASCII, si es así, luego de que se&&
ejecute el siguiente comando.find
imprime los resultadosnull
separados, esto es bueno para escapar de los nombres de archivo con espacios y metacaracteres en él.xargs
, usando la-0
opción, los leenull
separados,-I @@
toma cada registro y usa como parámetro posicional / argumentos para bash script.--
forbash
asegura que todo lo que viene después es un argumento, incluso si comienza con-
like,-c
que de lo contrario podría interpretarse como una opción bashSi necesita buscar tipos distintos de ASCII, simplemente reemplácelos
grep ASCII
con otro tipo, comogrep "PDF document, version 1.4"
fuente
Use el comando de búsqueda para listar todos los archivos, use el comando de archivo para verificar que sean texto (no tar, clave), finalmente use el comando awk para filtrar e imprimir el resultado.
fuente
Qué tal esto
fuente
"needle text"
"needl text"
"needle text"
, se encontrará