buscar excluir directorio

13

Estoy en Linux (Ubuntu) y me gustaría excluir ciertos directorios (como .hg) cuando estoy haciendo un

find | less  

Intenté lo siguiente para excluir el directorio .hg de la lista, pero no parece funcionar.

find -type d \( ! -iname \.hg \)
find -type d \( ! -name \.hg \)
find -type d \( ! -iname .hg \)

¿Cómo excluyo .directoryen un comando de búsqueda?

Senthil Kumaran
fuente

Respuestas:

14

En la búsqueda de una findsolución similar descubrí la explicación útil sobre cómo usar la opción '-prune' de 'find' en sh? por Laurence Gonsalves .

Podrías usar algo como:

find . \( -type d -name .hg -prune \) -o \( -type f -name "foo" -print \)

o (sin el nombre)

find . \( -type d -name .hg -prune \) -o \( -type f -print \)

Los paréntesis (escapó) \(y \)agrupan las pruebas ( typey name) y las acciones correspondientes ( pruney print, respectivamente) juntas a izquierda y derecha del OR (-o ).

Dado que -otiene una precedencia más baja que la yuxtaposición, puede omitir los paréntesis si lo desea. Muchas findimplementaciones también le permiten omitir la final -print.

find . -type d -name .hg -prune -o -type f -name "foo" -print
fheub
fuente
1
Estaba a punto de escribir mi solución, pero parece ser exactamente esto. Personalmente, puse el -pruneinterior del primer conjunto de paréntesis y el -type f -printsegundo conjunto, solo para hacer que las operaciones y / o las operaciones sean más obvias, pero de lo contrario, esto me parece perfecto.
yo_y
Mejoré los paréntesis (y su razonamiento) gracias al comentario de @me_and.
fheub
2

Echa un vistazo a ack: http://betterthangrep.com/

Además de tener un conjunto razonable de carpetas excluidas predeterminadas (por ejemplo, .hg es una exclusión predeterminada), es fácil excluir carpetas nuevas:

ack --ignore-dir=.directory search_term

Para devolver esto a su caso de uso donde está buscando una lista de archivos, debe usar la -fopción, como en:

ack -f --ignore-dir=.directory

Pasé de escribir comandos de búsqueda / búsqueda complicados a otros simples.

Consejo: coloque las opciones de línea de comandos de uso común (carpetas excluidas, por ejemplo) en un archivo .ackrc.

Brian Leathem
fuente
Basado find | lessen la pregunta, el OP está buscando una lista simple de archivos. ¿Cómo ayuda esto con eso?
un CVn
@ MichaelKjörling Como dije en mi respuesta, la opción -f proporciona una lista de archivos.
Brian Leathem 01 de
-2

puedes probar

find \( ! -regex '.*/\.directory\(\|/.*\)' \)
yuyichao
fuente
Bastante seguro de que esto no se parece en nada a lo que solicitó el OP.
yo_y
Solo pensé que esto es lo que quiere decir con.directory
yuyichao