Wie Art zu finden, so führt, dass Pfade mit einem aus einer Reihe von Mustern letzten beginnen, sortieren
Frage
Ich habe einen Befehl find, dass ich möchte so sortieren, dass die Einträge für bestimmte Verzeichnisse sortiert letzte. Der Grund dafür ist, dass diese Liste zu etags weitergegeben werden soll, eine Tags-Tabelle zu erstellen, und ich würde bestimmte Verzeichnisse Drittanbieter-Tool wie der Code, nachdem alle zu sein, die ich aktiv bearbeiten.
Kann jemand vorschlagen, eine gute einfache Art und Weise in die Liste als eine Änderung meiner Make-Datei Regel zu sortieren? Hier ist die aktuelle Regel:
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
Zum Beispiel Einträge, die „../flexlm/“ oder „../src/librsync“ beginnen sollte nach Einträgen kommen, die eines dieser Muster stimmen nicht überein.
Lösung
Setzen mehrere find
Befehle in einem Doppelpack Block und Rohr, das 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
Andere Tipps
Nun vorausgesetzt, Sie sich leisten können, mehrere Suchabfragen ausführen, und Sie haben Ihr Projekt so eingerichtet, dass es möglich ist, Ihre eigenen Quelldateien mit einer Abfrage und alle Bibliotheken mit anderen Abfragen ...
finden... Das wäre was ich tun würde.
Hier ist, was für mich gearbeitet, indem sie die oben genannten Antworten kombiniert und zwicken sie:
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