Estoy intentando buscar archivos que tengan patrón FW
. A partir de estos archivos filtrados, estoy intentando buscar patrones chmod.*archive|archive.*chmod
y luego enumerarlos.
Intenté con el siguiente comando, pero no me da el resultado deseado. Necesita ayuda para solucionar este problema.
find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more
Respuesta1
Si entendí correctamente, todo lo que necesitas es:
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
Eso será grep
su patrón en cada archivo encontrado por find
, y si grep
tiene éxito, enumerará el archivo en un formato similar a ls -l
.
Respuesta2
Como alternativa a lo que propuso @terdon, probablemente también podrías usar el siguiente comando:
grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW
EDITAR
Como ha señalado @Kusalananda:
Esto fallaría (daría un resultado incorrecto) si tiene coincidencias en archivos ubicados en directorios que contienen FW en sus nombres.
Ajustarlo para que funcione correctamente lo hace mucho menos legible. La solución que propuso @terdon es una opción más favorable (también más eficiente; consulte el comentario de @tedron).
Sin embargo aquí hay una versión corregida:
grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'
Respuesta3
Tiene dos opciones para obtener los nombres de ruta que corresponden a los archivos que tienen líneas que coinciden con su patrón:
Dejemos
find
generar los nombres de ruta:find . -name '*FW*' -type f \ -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
Esto se ejecuta
grep
en cada archivo encontrado individualmente y luego imprime los nombres de ruta de cada archivo que contiene coincidencias para el patrón (que, por cierto, convertí en un conjunto compatible con el estándar de dos expresiones regulares básicas separadas, ya que todo lo demás en la respuesta era estándar).Probablemente esto es lo que le gustaría usar si desea hacer algo más con los nombres de ruta además de simplemente imprimirlos en la terminal (simplemente agregue más
-exec
acciones).Dejemos
grep
generar los nombres de ruta:find . -name '*FW*' -type f \ -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
Esto se ejecuta
grep
en lotes de archivos encontrados. Lagrep
utilidad informará los nombres de ruta de cada archivo coincidente dada su-l
opción ("dash-ell").Es probable que esto se ejecute más rápido ya que minimiza la cantidad de
grep
invocaciones que se realizan y sería lo que haría si solo quisieramiraren los nombres de ruta.