Estoy tratando de encontrar todos los archivos que son de cierto tipo y no contienen una determinada cadena. Estoy tratando de hacerlo canalizando find a grep -v
ejemplo:
find -type f -name '*.java' | xargs grep -v "something something"
Parece que esto no funciona. Parece que solo está devolviendo todos los archivos que encontró el comando find. Lo que estoy tratando de hacer es básicamente encontrar todos los archivos .java que coincidan con un nombre de archivo determinado (por ejemplo, termina con 'Pb' como en SessionPb.java) y que no tienen un 'extiende algo' dentro de él.
Mi sospecha es que lo estoy haciendo mal. Entonces, ¿cómo debería ser el comando en su lugar?
Respuestas:
No hay necesidad
xargs
aquí. También debe usargrep
con la-L
opción (archivos sin coincidencia), porque de lo contrario generará el contenido del archivo en lugar de su nombre, como en su ejemplo.fuente
-L
Ya tiene negociación, porque significafiles _without_ match
. Por lo tanto, no necesita la-v
opción aquí.find -exec \+
alguien me escribe que es mucho mejor usar xargs. ¿Por qué nadie se ve hombre antes de escribir un comentario? (:-exec ... {} \+
no es equivalente axargs
. ¡Lea la documentación de findutils! (¡Trabajé bastante duro en ello!)xargs
procesa su entrada y separa los argumentos en el espacio en blanco. Las cotizaciones también son especiales (por defecto) paraxargs
. Ninguna de estas cosas es cierta-exec ... {} +
. Las versiones anteriores dexargs
solían considerar el guión bajo como un indicador EOF, pero este ya no es el caso.Casi lo tienes realmente ...
El punto '.' dice que comience desde aquí. (el tuyo lo implica ... pero nunca asumas).
-iname utiliza la búsqueda que no distingue entre mayúsculas y minúsculas, por si acaso (o solo en no caso).
-print0 envía nombres de archivo a xargs con un carácter \ x00 final, lo que evita problemas con nombres de archivos que tienen espacios en ellos.
el '-0' en xargs dice esperar nombres de archivo que terminan con \ x00 en lugar de retornos.
y tu comando grep ...
Más o menos lo tengo.
EDITAR::
De su actualización:
debería ayudar. (Se agregó -L de la respuesta de @ rush, buen trabajo)
Tengo la idea de que tu grep necesita la opción '-i' o ser menos explícito.
Pruebe el comando en partes ... ¿ESTO genera nombres de archivo que parecen correctos?
Si es así, es probable que su problema sea que su patrón de búsqueda grep no coincida (¿error de ortografía? ¡Sucede!), O simplemente no hay coincidencias.
Absolutamente peor de los casos:
hará MUCHO más trabajo buscando todo, pero debería darle algo de salida.
fuente
xargs -0 grep -v "something something"
De loxargs -0 grep -v "something something" /dev/null
contrario, obtendrá resultados extraños cuando find no produce archivos coincidentes.La computadora está siendo una computadora: está haciendo lo que le dijiste que hiciera en lugar de lo que querías que hiciera.
grep -v "something something"
imprime todas las líneas que no contienensomething something
. Por ejemplo, imprime dos líneas entre las tres siguientes:Para imprimir archivos que no contienen en
extends SomethingSomething
ninguna parte, use la-L
opción:Algunas versiones de grep no tienen la
-L
opción ( POSIX no lo especifica ). Si el tuyo no lo hace, haz que no imprima nada y usa el código de retorno para que el shell de llamada haga lo que sea que deba hacer.Alternativamente, use awk.
En Linux o Cygwin (u otro sistema con GNU grep), no necesita usar
find
, ya quegrep
es capaz de recurrir.Si su shell es ksh o bash o zsh, puede hacer que el shell coincida con el nombre del archivo. En bash, corre
set -o globstar
primero (puedes poner esto en tu~/.bashrc
).fuente
\s
es una extensión grep de GNU, que creo que es sinónimo de[[:space:]]
.