Funciona como magia! Sugerencia: use en -rLlugar de -Lhacer coincidir subdirectorios
Ufos
1
@Larry: una forma más limpia de evitar problemas de bloqueo es utilizar la opción larga "vacía" de esta manera: grep -L 'foo' -- *el estándar es que los comandos que toman opciones largas se usan --para indicar que no hay más opciones después de este punto.
Paddy Landau
45
Echa un vistazo a ack. Hace la .svnexclusión automáticamente, le da expresiones regulares de Perl y es una simple descarga de un solo programa de Perl.
El equivalente de lo que está buscando debe ser, en ack:
Desea cambiar el grep 0 al final por grep 0 $ (de lo contrario, obtendrá coincidencias erróneas en los archivos que tienen el carácter 0 en su nombre de archivo).
clouseau
99
@clouseau tiene razón en su mayoría ... ¡Sin embargo, grep '0$'también coincidiría con archivos con múltiplos de 10 líneas! Debe grep ':0$'al final verificar un ': 0' explícito al final de la línea. Entonces solo obtendrá archivos con cero líneas coincidentes.
TrinitronX
El UNIX en el que estoy no tenía versiones de find o grep con estas opciones, así que tuve que ir con el comando "ack" sugerido en otros comentarios.
KC Baltz
14
El siguiente comando excluye la necesidad de encontrar para filtrar las svncarpetas mediante el uso de un segundo grep.
Necesito refactorizar un proyecto grande que usa .phtmlarchivos para escribir HTML usando código PHP en línea. Quiero usar plantillas de bigote en su lugar. Quiero encontrar cualquier .phtmlgiles que no contenga la cadena, new Mustacheya que aún deben reescribirse.
find . Encuentra archivos recursivamente, comenzando en este directorio
-iname '*.phtml'El nombre del archivo debe contener .phtml( iesto hace que no distinga entre mayúsculas y minúsculas)
-exec 'grep -H -E -o -c 'new Mustache' {}'Ejecute el grepcomando en cada una de las rutas coincidentes
Grep
-H Siempre imprima encabezados de nombre de archivo con líneas de salida.
-E Interprete el patrón como una expresión regular extendida (es decir, forzar a grep a comportarse como egrep).
-o Imprime solo la parte coincidente de las líneas.
-c Solo un recuento de líneas seleccionadas se escribe en la salida estándar.
Esto me dará una lista de todas las rutas de archivos que terminan en .phtml, con un recuento de la cantidad de veces que la cadena new Mustacheocurre en cada una de ellas.
Olvidé los comandos, pero en lugar de descartar los nombres de los archivos, en realidad puede hacer una diffsecuencia de salida entre dos (creo que rodea los comandos con paréntesis, y también hay un paréntesis angular en alguna parte), si su sistema lo admite, lo que supongo es la pregunta, ya que no es compatiblegrep -L
Dexygen
1
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Puede especificar el filtro en "buscar" y la cadena de exclusión en "grep -vwE". Use mtime en find si necesita filtrar también en el tiempo modificado.
Como hay poco progreso en el informe de error, no se debe confiar en la -Lopción mencionada a continuación , siempre y cuando el error no se haya resuelto. Utilice diferentes enfoques presentados en este hilo en su lugar. Citando un comentario para el informe de error [énfasis mío]:
¿Alguna actualización sobre esto? -Lignora completamente las coincidencias en la primera línea del archivo. Parece que si esto no se va a solucionar pronto, la bandera debería eliminarse por completo, ya que efectivamente no funciona como se anuncia .
The Silver Searcher - Ag (función prevista - ver informe de error)
Esto imprime las líneas que no contienen el patrón. Puede agregar la -lopción para imprimir solo el nombre del archivo; pero esto todavía imprime los nombres de cualquier archivo que contenga cualquier línea que no contenga el patrón. Creo que el OP quiere encontrar los archivos que no contienen ninguna línea que contenga el patrón.
tripleee
El comando que proporcionó enumera los archivos en "filepath" con todas sus líneas que no contienen "patrón".
Aprodan
-6
El siguiente comando podría ayudarlo a filtrar las líneas que incluyen la subcadena "foo".
Esto imprime líneas que no coinciden, no nombres de archivos que no contienen una coincidencia en ninguna línea. Para agregar insulto a la lesión, es un uso inútil decat .
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)ag -L 'foo'
-rL
lugar de-L
hacer coincidir subdirectoriosgrep -L 'foo' -- *
el estándar es que los comandos que toman opciones largas se usan--
para indicar que no hay más opciones después de este punto.Echa un vistazo a
ack
. Hace la.svn
exclusión automáticamente, le da expresiones regulares de Perl y es una simple descarga de un solo programa de Perl.El equivalente de lo que está buscando debe ser, en
ack
:fuente
Puedes hacerlo solo con grep (sin encontrar).
Esta es la explicación de los parámetros utilizados en
grep
Si usa
l
(en minúsculas) obtendrá lo contrario (archivos con coincidencias)fuente
El siguiente comando me da todos los archivos que no contienen el patrón
foo
:fuente
grep '0$'
también coincidiría con archivos con múltiplos de 10 líneas! Debegrep ':0$'
al final verificar un ': 0' explícito al final de la línea. Entonces solo obtendrá archivos con cero líneas coincidentes.El siguiente comando excluye la necesidad de encontrar para filtrar las
svn
carpetas mediante el uso de un segundogrep
.fuente
Realmente necesitarás:
fuente
Tuve buena suerte con
Mis intentos con
grep -v
solo me dieron todas las líneas sin "foo".fuente
Problema
Necesito refactorizar un proyecto grande que usa
.phtml
archivos para escribir HTML usando código PHP en línea. Quiero usar plantillas de bigote en su lugar. Quiero encontrar cualquier.phtml
giles que no contenga la cadena,new Mustache
ya que aún deben reescribirse.Solución
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
Explicación
Antes de las tuberías:
Encontrar
find .
Encuentra archivos recursivamente, comenzando en este directorio-iname '*.phtml'
El nombre del archivo debe contener.phtml
(i
esto hace que no distinga entre mayúsculas y minúsculas)-exec 'grep -H -E -o -c 'new Mustache' {}'
Ejecute elgrep
comando en cada una de las rutas coincidentesGrep
-H
Siempre imprima encabezados de nombre de archivo con líneas de salida.-E
Interprete el patrón como una expresión regular extendida (es decir, forzar a grep a comportarse como egrep).-o
Imprime solo la parte coincidente de las líneas.-c
Solo un recuento de líneas seleccionadas se escribe en la salida estándar.Esto me dará una lista de todas las rutas de archivos que terminan en
.phtml
, con un recuento de la cantidad de veces que la cadenanew Mustache
ocurre en cada una de ellas.La primera tubería
grep :0$
filtra esta lista para incluir solo líneas que terminan en:0
:La segunda tubería
sed 's/..$//'
elimina los dos caracteres finales de cada línea, dejando solo las rutas de archivo.fuente
Si está utilizando git, esto busca todos los archivos rastreados:
y puede buscar en un subconjunto de archivos rastreados si tiene activado ** globbing del subdirectorio (
shopt -s globstar
en .bashrc, vea esto ):fuente
Mi grep no tiene ninguna opción -L. Encuentro la solución para lograr esto.
Las ideas son:
marque la diferencia entre el archivo de volcado 2 con el comando diff.
fuente
diff
secuencia de salida entre dos (creo que rodea los comandos con paréntesis, y también hay un paréntesis angular en alguna parte), si su sistema lo admite, lo que supongo es la pregunta, ya que no es compatiblegrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Puede especificar el filtro en "buscar" y la cadena de exclusión en "grep -vwE". Use mtime en find si necesita filtrar también en el tiempo modificado.
fuente
Informe de error abierto
Como comentó @tukan, hay un informe de error abierto para Ag con respecto a la bandera
-L
/--files-without-matches
:--files-without-matches
no funciona correctamenteComo hay poco progreso en el informe de error, no se debe confiar en la
-L
opción mencionada a continuación , siempre y cuando el error no se haya resuelto. Utilice diferentes enfoques presentados en este hilo en su lugar. Citando un comentario para el informe de error [énfasis mío]:The Silver Searcher - Ag (función prevista - ver informe de error)
Como una alternativa poderosa a
grep
, podría usar The Silver Searcher - Ag :Mirando
man ag
, encontramos la opción-L
u--files-without-matches
:Es decir, para buscar de forma recursiva archivos que no coinciden
foo
, desde el directorio actual:Para buscar solo en el directorio actual archivos que no coincidan
foo
, simplemente especifique--depth=0
la recursividad:fuente
-L
error - github.com/ggreer/the_silver_searcher/issues/238Otra alternativa cuando grep no tiene la opción -L (IBM AIX por ejemplo), con nada más que grep y el shell:
fuente
o
el comando anterior nos dará el resultado cuando -v encuentre el inverso del patrón que se está buscando
fuente
-l
opción para imprimir solo el nombre del archivo; pero esto todavía imprime los nombres de cualquier archivo que contenga cualquier línea que no contenga el patrón. Creo que el OP quiere encontrar los archivos que no contienen ninguna línea que contenga el patrón.El siguiente comando podría ayudarlo a filtrar las líneas que incluyen la subcadena "foo".
fuente
cat
.