¿Cómo encontrar Ordenar resultados tales que las rutas que comienzan con uno de un conjunto de patrones se clasifican última
Pregunta
Tengo un comando find que me gustaría para ordenar tal que las entradas para ciertos directorios se clasifican pasado. La razón es que esta lista se va a pasar a etags para crear una tabla de etiquetas y me gustaría ciertos directorios de herramientas de terceros para ser después de todo el código que activa de edición.
Puede alguien sugerir una buena manera fácil para ordenar la lista como un cambio a mi regla makefile? Esta es la regla actual:
tags:
rm -f ../TAGS
find .. \( -not -regex '.*include/.*' \) \
-a \( -name '*.h' -o -name '*.hh' -o -name '*.y' \
-o -name '*.l' -o -name '*.cc' -o -name '*.cpp' \
-o -name '*.c' -o -name '*.inl' \) \
| xargs etags -o ../TAGS --append
Por ejemplo, los ingresos que comienzan "../flexlm/" o "../src/librsync" debe venir en pos de las entradas que no coinciden con uno de estos patrones.
Solución
Ponga varios comandos find
en un bloque de refuerzo y el tubo que en xargs
:
# the single quotes take care of the escaping
pattern='( -not -regex ".*include/.*" )
-a ( -name "*.h" -o -name "*.hh" -o -name "*.y"
-o -name "*.l" -o -name "*.cc" -o -name "*.cpp"
-o -name "*.c" -o -name "*.inl" )'
{
find ! -path "../flexlm/*" ! -path "../src/librsync/*" $pattern
find -path "../flexlm/*" $pattern
find -path "../src/librsync/*" $pattern
} | xargs etags -o ../TAGS --append
Otros consejos
Bueno, suponiendo que usted puede permitirse el lujo de ejecutar varias consultas encontrar y tener su proyecto configurado de tal manera que es posible encontrar sus propios archivos de origen con una consulta y ninguna biblioteca con otras consultas ...
... Eso sería lo que haría.
Esto es lo que funcionó para mí mediante la combinación de las respuestas anteriores y ajustar ellos:
PATTERN := \( -not -regex '.*include/.*' \) \
-a \( -name '*.h' -o -name '*.hh' -o -name '*.y' \
-o -name '*.l' -o -name '*.cc' -o -name '*.cpp' \
-o -name '*.c' -o -name '*.inl' \)
.PHONY: tags
tags:
rm -f ../TAGS
find .. \
! -path "../src/librsync/*" \
! -path "../flexlm/*" \
$(PATTERN) | xargs etags -o ../TAGS --append
find .. -path "../src/librsync/*" \
$(PATTERN) | xargs etags -o ../TAGS --append
find .. -path "../flexlm/*" \
$(PATTERN) | xargs etags -o ../TAGS --append