risultato così come trovare sorta che i percorsi che iniziano con uno di una serie di modelli sono ordinati lo scorso

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

Domanda

Ho un comando find che vorrei ordinare in modo tale che le voci per alcune directory sono ordinati scorso. La ragione è che questa lista è da passare al etags per creare una tabella tag e vorrei alcune directory strumento di terze parti di essere, dopo tutto il codice che ho attivamente di modifica.

Qualcuno può suggerire un buon modo semplice per ordinare l'elenco come un cambiamento alla mia regola di makefile? Ecco la regola corrente:

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

Per esempio, le voci che iniziano "../flexlm/" o "../src/librsync" dovrebbe venire dopo le voci che non corrispondono a uno di questi modelli.

È stato utile?

Soluzione

Inserire più comandi find in un blocco tutore e tubo che in 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

Altri suggerimenti

Bene supponendo che si può permettere di eseguire più query trovare e avere il vostro progetto impostato in modo tale che sia possibile trovare i propri file di origine con una query e le librerie con altre domande ...

... che sarebbe quello che avrei fatto.

Ecco che cosa ha funzionato per me combinando le risposte di cui sopra e li tweaking:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top