Comment trouver le résultat genre tels que les chemins commençant par un d'un ensemble de motifs sont triés dernière
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.
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