grep ack

ack pierde resultados(vs. grep)



(4)

Estoy seguro de que estoy malinterpretando algo sobre el archivo / directorio de Ack, ignorar los valores predeterminados, pero tal vez alguien podría arrojar algo de luz sobre esto:

mbuck$ grep logout -R app/views/ Binary file app/views/shared/._header.html.erb.bak.swp matches Binary file app/views/shared/._header.html.erb.swp matches app/views/shared/_header.html.erb.bak: <%= link_to logout_text, logout_path, { :title => logout_text, :class => ''login-menuitem'' } %> mbuck$ ack logout app/views/ mbuck$

Mientras...

mbuck$ ack -u logout app/views/ Binary file app/views/shared/._header.html.erb.bak.swp matches Binary file app/views/shared/._header.html.erb.swp matches app/views/shared/_header.html.erb.bak 98:<%= link_to logout_text, logout_path, { :title => logout_text, :class => ''login-menuitem'' } %>

Simplemente llamando a ack sin opciones no se puede encontrar el resultado dentro de un archivo .bak , pero llamar con la opción --unrestricted puede encontrar el resultado. Por lo que puedo decir, ack no ignora los archivos .bak forma predeterminada.

ACTUALIZAR

Gracias a los útiles comentarios a continuación, aquí están los nuevos contenidos de mi ~/.ackrc :

--type-add=ruby=.haml,.rake --type-add=css=.less


En lugar de luchar con ack, puede usar simplemente grep antiguo, desde 1973. Debido a que utiliza archivos de la lista negra explícitamente, en lugar de tipos de archivo en la lista blanca, nunca omite los resultados correctos. Dado un par de líneas de configuración (que creé en el directorio de mi ''homefile'' repo en la década de 1990), grep realmente iguala o supera muchas de las ventajas reivindicadas de ack, en particular, la velocidad: al buscar el mismo conjunto de archivos, grep es mas rapido que ack

La configuración de grep que me hace feliz se ve así, en mi .bashrc:

# Custom ''grep'' behaviour # Search recursively # Ignore binary files # Output in pretty colors # Exclude a bunch of files and directories by name # (this both prevents false positives, and speeds it up) function grp { grep -rI --color --exclude-dir=node_modules --exclude-dir=/.bzr --exclude-dir=/.git --exclude-dir=/.hg --exclude-dir=/.svn --exclude-dir=build --exclude-dir=dist --exclude-dir=.tox --exclude=tags "$@" } function grpy { grp --include=*.py "$@" }

La lista exacta de archivos y directorios a ignorar probablemente será diferente para usted: soy principalmente un desarrollador de Python y esta configuración me funciona.

También es fácil agregar sub-personalizaciones, como muestro para mi ''grpy'', que uso para grep Python source.

Definir funciones de bash como estas es preferible a configurar GREP_OPTIONS, que hará que TODAS las ejecuciones de grep desde su shell de inicio de sesión se comporten de manera diferente, incluidas las invocadas por los programas que ha ejecutado. Es probable que esos programas muestren el comportamiento inesperadamente diferente de grep.

Mis nuevas funciones, ''grp'' y ''grpy'', no ocultan deliberadamente ''grep'', por lo que aún puedo usar el comportamiento original cada vez que lo necesite.


Si alguna vez está confundido acerca de qué archivos buscará ack, simplemente agregue la opción -f. Enumera todos los archivos que se pueden buscar.


ack --man estados:

Si desea que un archivo de búsqueda busque todos los archivos, incluso los que siempre ignora como archivos de copia de respaldo y de copia de respaldo, use el interruptor "−u".

y

¿Por qué ack ignora los archivos desconocidos por defecto? ack está diseñado por un programador, para programadores, para buscar grandes árboles de código. La mayoría de las bases de código tienen muchos archivos que no son archivos de origen (como archivos de objetos compilados, metadatos de control de fuente, etc.), y grep pierde mucho tiempo buscando todos ellos y devolviendo coincidencias de esos archivos.

Es por eso que el comportamiento de ack de no buscar cosas que no reconoce es una de sus fortalezas más grandes: la velocidad que obtiene al buscar solo las cosas que desea ver.

EDITAR: Además, si observa el código fuente, los archivos bak se ignoran.


ack es peculiar porque no tiene una lista negra de tipos de archivos que ignorar, sino una lista blanca de tipos de archivos en los que buscará .

Para citar desde la página del manual:

Sin selecciones de archivos, ack-grep solo busca archivos de los tipos que reconoce. Si tiene un archivo llamado foo.wango , y ack-grep no sabe qué es un archivo .wango, ack-grep no lo buscará.

(Tenga en cuenta que estoy usando Ubuntu donde el binario se llama ack-grep debido a un conflicto de nombres)

ack --help-types mostrará una lista de los tipos que admite su instalación de ack.