Estoy tratando de componer una grepdeclaración y me está matando. También estoy cansado de recibir el arguments list too longerror. 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.txtotro 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
grepcon-Ry 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 longerror, 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
mvinvocaciones con un argumento cada una:... | xargs -0 mv -t bar/(suponiendo que sumvsoporte sea compatible con la-topción).utilizar
decirle a grep que lea del
subset.txtarchivo.puede usar find para recorrer el archivo.
o
fuente
findlugar de-rotra que hacer filtrado adicional?grep -rbusca 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).greptienen opciones para controlar su interacción con enlaces simbólicos (man greppara determinar los detalles del sistema actual). Un recursivogrepserá mucho más rápido que ejecutarsegrepindividualmente 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 recursivogrepno sea más rápido que variosgreps ejecutadosfinddebido 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