Comment trouver le résultat genre tels que les chemins commençant par un d'un ensemble de motifs sont triés dernière

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

Question

J'ai une commande find que je voudrais trier ce que les entrées pour certains répertoires sont classés dernier. La raison en est que cette liste doit être transmise à etags pour créer une table de balises et je voudrais certains répertoires d'outils tiers pour être après tout le code que je activement modifier.

Quelqu'un peut-il suggérer un bon moyen facile pour trier la liste comme un changement à ma règle de makefile? Voici la règle actuelle:

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

Par exemple, les entrées qui commencent « ../flexlm/ » ou « ../src/librsync » devrait venir après les entrées qui ne correspondent pas à l'un de ces motifs.

Était-ce utile?

La solution

Mettre plusieurs commandes find dans un bloc d'entretoise et tuyau 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

Autres conseils

Et bien en supposant que vous pouvez vous permettre d'exécuter plusieurs requêtes de trouver et vous avez votre projet mis en place de telle sorte qu'il est possible de trouver vos propres fichiers source avec une requête et toutes les bibliothèques avec d'autres requêtes ...

... Ce serait ce que je ferais.

Voici ce qui a fonctionné pour moi en combinant les réponses ci-dessus et les peaufinage:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top