¿Cómo encontrar Ordenar resultados tales que las rutas que comienzan con uno de un conjunto de patrones se clasifican última

StackOverflow https://stackoverflow.com/questions/3697457

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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top