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 findpara encontrar solo archivos no binarios:
find . -type f -exec grep -Iq . {} \; -print
La -Iopción grep le dice que ignore inmediatamente los archivos binarios y la .opción junto con -qhará que coincida inmediatamente con los archivos de texto, por lo que va muy rápido. Puede cambiar el -printa a -print0para la tubería en un xargs -0o 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, -andse puede omitir ya que está implícito.
find . -type f -exec grep -Il "" {} \;.find -type f -exec grep -Iq . {} \; -and -printque tiene la ventaja de que mantiene los archivosfind; puede sustituirlo-printpor otro-execque solo se ejecute para archivos de texto. (Si dejagrepimprimir 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-execcomo sugirió @ lucas.werkmeisterBasado en esta pregunta SO :
grep -rIl "needle text" my_folderfuente
-Ies 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
.bashrcy 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
filemanual: "Los usuarios dependen de saber que todos los archivos legibles en un directorio tienen impresa la palabra 'texto'"./proc/meminfo,/proc/cpuinfoetc. son archivos de texto, perofile /proc/meminfodice/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
sedfiltro final .Puede filtrar los tipos de archivos innecesarios agregando más
-e 'type'opciones al últimogrepcomando.EDITAR:
Si su
xargsversión admite la-dopció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.findcomprobará todos los archivos del directorio.filenos dará el tipo de archivo. En nuestro caso, estamos buscando un retorno de 'texto ASCII'grepbuscará la palabra clave 'ASCII' en la salida defileEntonces, ¿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. Elfindcomando 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. Elfilecomando 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 elfindcomando, 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 porfindy es el signo de puntuación al final de nuestro-execcomando. 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 delfindcomando (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 elgrepcomando devuelva verdadero. Voila.fuente
Si está interesado en encontrar cualquier tipo de archivo por sus bytes mágicos usando la increíble
fileutilidad 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
&¶ 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:
findelementos que son archivosxargscada elemento se alimente como una línea en unbashcomando / script de líneafileverifica el tipo de archivo por byte mágico,grepverifica si existe ASCII, si es así, luego de que se&&ejecute el siguiente comando.findimprime los resultadosnullseparados, esto es bueno para escapar de los nombres de archivo con espacios y metacaracteres en él.xargs, usando la-0opción, los leenullseparados,-I @@toma cada registro y usa como parámetro posicional / argumentos para bash script.--forbashasegura que todo lo que viene después es un argumento, incluso si comienza con-like,-cque de lo contrario podría interpretarse como una opción bashSi necesita buscar tipos distintos de ASCII, simplemente reemplácelos
grep ASCIIcon 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á