Estoy tratando de componer una grep
declaración y me está matando. También estoy cansado de recibir el arguments list too long
error. Tengo un archivo, llamémoslo subset.txt
. Contiene cientos de líneas con cadenas específicas como MO43312948
. En mi directorio de objetos tengo miles de archivos y necesito copiar todos los archivos que contienen las cadenas enumeradas en subset.txt
otro directorio.
Estaba tratando de comenzar con esto para devolver los archivos coincidentes del directorio de objetos.
grep -F "$(subset.txt)" /objects/*
Sigo recibiendo `bash: / bin / grep: Lista de argumentos demasiado larga``
"$(subset.txt)"
el comando así? Esa es la sustitución de comandos , lo que hará que su shell se ejecutesubset.txt
(como si fuera un comando o script).Respuestas:
Puede pasar un directorio como un objetivo para
grep
con-R
y un archivo de patrones de entrada con-f
:Entonces, estás buscando:
Puede obtener la lista de archivos coincidentes con:
Entonces, si su lista final no es demasiado larga, simplemente puede hacer:
Si eso devuelve un
argument list too long
error, use:Y si los nombres de sus archivos pueden contener espacios u otros caracteres extraños, use (suponiendo GNU
grep
):Finalmente, si desea excluir archivos binarios, use:
fuente
mv
invocaciones con un argumento cada una:... | xargs -0 mv -t bar/
(suponiendo que sumv
soporte sea compatible con la-t
opción).utilizar
decirle a grep que lea del
subset.txt
archivo.puede usar find para recorrer el archivo.
o
fuente
find
lugar de-r
otra que hacer filtrado adicional?grep -r
busca en enlaces simbólicos a archivos regulares, lo que puede o no ser deseable (si apuntan dentro del mismo árbol, está buscando el mismo archivo dos veces; si apuntan afuera, está buscando un archivo que puede o no ser deseado).grep
tienen opciones para controlar su interacción con enlaces simbólicos (man grep
para determinar los detalles del sistema actual). Un recursivogrep
será mucho más rápido que ejecutarsegrep
individualmente en cada archivo a través defind
.-exec +
, por lo que agrupará los archivos y no ejecutará un grep por archivo.-exec {} +
vs-exec {} \;
... aprendes algo nuevo todos los días (todavía no veo ninguna razón por la cual un solo recursivogrep
no sea más rápido que variosgrep
s ejecutadosfind
debido a la creación de procesos y al análisis de patrones por encima de la cabeza, pero yo no tengo números específicos para respaldar eso).Si desea acelerar grep aún más, puede establecer la configuración regional en su shell antes de ejecutarlo, es decir, usar "LC_ALL = c". Esto se heredará en grep y deshabilitará el procesamiento Unicode cuando no sea necesario y, en algunos casos, puede acelerar dramáticamente grep. Un gran blog que documenta esto se puede encontrar en http://www.inmotionhosting.com/support/website/ssh/speed-up-grep-searches-with-lc-all . Este truco también puede acelerar los scripts de shell bash, no solo grep.
fuente