Ich habe ein ziemlich interessantes Problem, das ich versuche, die optimale Lösung für zu finden. Ich erstelle ein Dateiautokomplettierungs-Backend für Emacs. Das bedeutet, dass ich den Linux-Befehl find
verwende, um Dateien und Verzeichnisse zu erhalten.Unix finden Liste passende Verzeichnisse
Das Backend eine Datei mit einem teilweise fertiggestellten Pfad angegeben wird (zB /usr/folder/foo
) und ich möchte alle Dateien und Verzeichnisse greifen, die den Teilpfad für zwei Verzeichnisse nach unten (zB zum Beispiel passen könnten es foo_bar/
bieten könnte, foo_bar/bar
, foo_bar/baz
, foo_bar/bat/
foo_baz
). Bisher war ich nur dies in 3 Schritten zu brechen
alle Dateien im aktuellen Verzeichnis finden, die das Präfix übereinstimmen kann
find foo* -type f -maxdepth 1
sammeln alle möglichen Verzeichnisse wir durch
find foo* -type d -maxdepth 1
suchen möchten
jedes dieser Verzeichnisse verwenden, um 2 weitere Anrufe zu finden (ich brauche zwischen Dateien und Verzeichnissen unterscheiden können)
find foo_bar/ -type d -maxdepth 1
find foo_bar/ -type f -maxdepth 1
Diese Lösung beinhaltet viel von Aufrufen an find
(vor allem, weil der letzte Schritt für jedes übereinstimmende Verzeichnis aufgerufen werden muss). Dies führt dazu, dass Kandidaten besonders in großen Dateisystemen langsam werden. Idealerweise möchte ich nur einen Anruf machen, um alle Kandidaten zu bekommen. Aber ich habe keinen guten Weg gefunden, das zu tun. Kennt jemand eine optimale Lösung?