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 llamadofoo.wango
, yack-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.