Eine Suche mit locate
findet Pfade im Dateisystem.
Oft wissen Sie von vornherein, dass Sie entweder nur an Dateien oder nur an Verzeichnissen interessiert sind.
Eine Suche nach Orten liefert oft viele Ergebnisse. Es wäre nützlich, nur einen der Typen in das Ergebnis aufzunehmen, da dies die Ausgabe verkürzt.
Es gibt jedoch ein interessanteres Argument, Dateien oder Verzeichnisse wegzulassen: Die Liste der Ergebnispfade kann nicht nur theoretisch mehrdeutig sein.
Das folgende Beispiel ist ein realer Fall und nicht ungewöhnlich:
$ locate --regex --basename "xfce4-keyboard-overlay$"
/usr/local/bin/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay
Ok, wir haben was gefunden! Aber ... Dateien oder Verzeichnisse?
$ file /usr/local/bin/xfce4-keyboard-overlay
/usr/local/bin/xfce4-keyboard-overlay: bash script
Das ist also eine Datei ...
$ file /usr/local/share/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay: directory
während die zweite nicht ist.
Diese Mehrdeutigkeit erschwert das Lesen langer Pfadlisten locate
. Es wäre also sehr hilfreich, Verzeichnisse herauszufiltern, beispielsweise mit einer Kommandozeilenoption für .
Gibt es so etwas? Auch wenn der Filter für Verzeichnisse von locate getrennt ist?
Zumindest könnte man ein Skript verwenden, um alle zu überprüfenden Dateinamen zu iterieren - was langsam sein kann.
while
Anweisung bewirkt?printf
für beliebige Daten verwenden .locate
undread
wie hier vorgeschlagen erweitern. transnum.blogspot.ie/2008/11/…quelle
/usr/local/share/xfce4-keyboard-overlay
alle Unterverzeichnisse auflisten . Hinzufügen-maxdepth 0
hilft.locate --regex --basename "xfce4-keyboard-overlay$" | xargs -I % sh -c "test -d % && echo %"
xargs
withfind
war eine gute Idee. Ich habe es bearbeitet, um es stabiler zu machen. Ich hoffe es macht dir nichts aus.xargs
wird für jede Zeile Befehl wiederholen , wenn Sie angeben ,-L 1
oder-i
Parameter.Siehe hier
Zugegeben, es wird eine neue Shell für jede Datei erstellt, aber es hat den Vorteil, dass es schön und kompakt ist.
EDIT: Ich war mit dieser Antwort nicht ganz zufrieden, da für jede Datei eine neue Shell gestartet wurde. Dies sollte nur zwei Prozesse haben:
Natürlich wäre es schön, wenn wir es vermeiden könnten, einen Dolmetscher aus dem Weg
xargs
zu räumen , aber seine Fähigkeit, Befehle zu verketten , scheint eingeschränkt zu sein.quelle
/home/evil/$(reboot)/xfce4-keyboard-overlay
und ich habe sie dummerweise als ausgeführtroot
).Meine zwei Cent:
Dies ist mehr oder weniger die Art und Weise, wie G-Man dies mit Prozesssubstitution kombiniert.
quelle
Was ist, wenn Sie
locate
mitfile
und kombinierengrep
? ...quelle
file
für jeden einzelnen Pfad erstellt. Beachten Sie, dass es häufig viele Ergebniszeilen für locate gibt. Mein aktueller Test ist die Suche nach "gnome", mit etwa 73000 Pfaden zum Testen.$f
Datei öffnet dasfile
Programm diese Datei und liest daraus . Dies ist extrem teuer, wenn Sie nur a . ………… Außerdem führt dies zu falschen Ergebnissen für Dateien, deren Name "directory" enthält (z. B. "phone_directory"). …………… (Außerdem kann die Syntax keine Namen verarbeiten, die Leerzeichen enthalten.)stat()
for f in `…`; do …