Usando buscar con sh - el comando no funciona

Usando buscar con sh - el comando no funciona

Estoy intentando buscar archivos que tengan patrón FW. A partir de estos archivos filtrados, estoy intentando buscar patrones chmod.*archive|archive.*chmody 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á grepsu patrón en cada archivo encontrado por find, y si greptiene é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:

  1. Dejemos findgenerar los nombres de ruta:

    find . -name '*FW*' -type f \
        -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
    

    Esto se ejecuta grepen 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 -execacciones).

  2. Dejemos grepgenerar los nombres de ruta:

    find . -name '*FW*' -type f \
        -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
    

    Esto se ejecuta grepen lotes de archivos encontrados. La greputilidad informará los nombres de ruta de cada archivo coincidente dada su -lopción ("dash-ell").

    Es probable que esto se ejecute más rápido ya que minimiza la cantidad de grepinvocaciones que se realizan y sería lo que haría si solo quisieramiraren los nombres de ruta.

información relacionada