Verwendung von locate, um nur nach Ordnern zu suchen

3056
shrx

Auf einem UNIX-System durchsucht "locate" die Datenbank nach Dateien mit dem ausgewählten Namen oder nach Dateien im Ordner mit dem ausgewählten Namen. Wie kann ich locate verwenden, um nur Ordner und keine Dateien auszugeben?

3
Siehe auch [diese ähnliche Frage auf unix.stackexchange.com] (http://unix.stackexchange.com/q/192739) sch vor 9 Jahren 0

7 Antworten auf die Frage

5
Frank M

Tatsächlich locatehat es alles, wenn Sie die --regexpOption verwenden und es Ihnen nichts ausmacht, Dateien auszuspucken, die denselben Namen wie die Verzeichnisse haben, nach denen Sie suchen. Die Positionsmarkierung "Zeilenende" erledigt den Job:

locate -r '/dirname$' 

locateunterstützt auch, --ignore-casewenn es das ist, was Sie wollen.

Um nach allen Verzeichnissen zu suchen, suchen Sie nach '-r' /[ ^\.**$ '`. Mateen Ulhaq vor 6 Jahren 0
Mateens Ansatz filtert nicht nach Verzeichnissen. Es gibt alles in der Datenbank zurück. Das OP hat nach einem bestimmten Verzeichnis gesucht und scheint den Namen des gewünschten Verzeichnisses zu kennen. Frank M vor 6 Jahren 0
3
Scott C Wilson

Warum verwenden Sie nicht den Suchbefehl?

find . -name YOUR_SEARCH_NAME -type d 
locate ist schneller und ich brauche es nicht, um die ganze Zeit für meinen Zweck auf dem neuesten Stand zu sein. shrx vor 12 Jahren 4
2
Der Hochstapler

locateselbst kann es nicht für dich tun. Die UNIX-Methode besteht darin, die Ausgabe von zu filtern locate:

locate --null something | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} + 
Dieser Befehl hat gerade meinen Rechner neu gestartet (ich hatte eine `/ tmp / irgendwas $ (Neustart)` Datei). sch vor 9 Jahren 5
@sch Wow, das ist scheiße Der Hochstapler vor 9 Jahren 2
Der richtige Weg ist mit etwas wie `locate --null etwas | xargs -r0 sh -c 'für i [-d "$ i"] && printf "% s \ n" "$ i"; fertig 'sh {} + `. `{}` sollte niemals in den Shell-Code eingebettet sein, das ist so schlimm wie die Verwendung von 'eval' mit beliebigen Daten (daher der Downvote). sch vor 9 Jahren 0
Beachten Sie, dass `[-d` auch für Symlinks zu Verzeichnissen true zurückgibt. Nicht unbedingt schlecht, nur erwähnenswert, da es sich zum Beispiel von "find -type d" unterscheidet. sch vor 9 Jahren 0
@sch: Wenn Sie die Konsequenzen nicht verstehen und wenn Sie die Gewohnheit haben, Dateien mit dem Namen $ (reboot) `auf Ihrem Computer zu haben, sollten Sie möglicherweise keine Befehle ausführen, die Sie im Internet mit sudo finden `; D Aber danke dafür, dass Sie eine bessere Version zur Verfügung gestellt haben, können Sie diese gerne bearbeiten oder als Antwort posten, damit sie nicht in Kommentaren verloren geht. Der Hochstapler vor 9 Jahren 1
Unix-Systeme sind für mehrere Benutzer geeignet und / tmp ist weltweit beschreibbar (und sogar auf Einzelplatzsystemen können Sie oder ein Netzwerkdienst dazu verleitet werden, Dateien mit dem Namen "so" zu erstellen). Das Einbetten dieses `{}` ist ein Fehler, der leicht auf eine Sicherheitsanfälligkeit aufgerüstet werden kann. IMO, auf öffentlichen Q & A-Websites sollten wir zumindest die Einschränkungen aufzeigen. Fühlen Sie sich frei, diesen Code in Ihre Antwort aufzunehmen. Ich bin normalerweise nicht für [SU] verantwortlich, ich bin gerade über einen Link auf [unix.SE] dorthin gekommen. sch vor 9 Jahren 0
@sch: Du hast definitiv einen Punkt, danke für den verbesserten Code. Der Hochstapler vor 9 Jahren 0
1
Daniel Andersson

findwie in Scott Wilsons Antwort vorgeschlagen, hätte ich verwendet. Wenn Sie jedoch die locate-Datenbank wirklich benötigen, könnte dies eine hackish Lösung sein

sudo strings /var/lib/mlocate/mlocate.db | grep -E '^/.*dirname' 
  • sudo da die Datenbank von normalen Benutzern nicht direkt gelesen werden kann.
  • stringszum Entfernen von Metadaten (dadurch werden auch Verzeichnisse gefunden, für die Sie keine Leseberechtigung haben, was locatenormalerweise behindert wird).
  • /var/lib/mlocate/mlocate.dbist der DB-Pfad anscheinend auf Ubuntu (als Beispiel. Andere Distributionen könnten es an anderen Stellen haben, zB /var/lib/slocate/slocate.db).
  • grep -E um reguläre Ausdrücke zu aktivieren.
  • ^/.*dirnamestimmt mit allen Zeilen überein, die mit a beginnen /, was alle Verzeichnisse in der Datenbank passieren, gefolgt von einem beliebigen Zeichen und dem Suchbegriff.

Positive Seiten dieser Lösung:

  • es ist schneller als find,
  • Sie können alle Glocken und Pfeifen grep(oder andere bevorzugte Textverarbeitungswerkzeuge) verwenden.

Negative Seiten:

  • wie locateim Allgemeinen (DB muss aktualisiert werden),
  • Sie benötigen Root-Zugriff.
Ja, root-Zugriff für eine solche Aufgabe sollte wirklich vermieden werden. shrx vor 12 Jahren 0
1
JosephHarriott

Oliver Salzburgs gepflegte Linie in Ihre .bashrc:

# locate directories: # ------------------- locd () { locate $1 | xargs -I {} bash -c 'if [ -d "{}" ]; then echo {}; fi' } 

Sie können dann locd somethingjedes Mal eingeben, wenn Sie nur Verzeichnisse suchen möchten.

Um mit Leerzeichen in Verzeichnissen besser umgehen zu können, verwende ich Folgendes: `locate -i --all $ 1 | xargs -I {} bash -c 'if [-d "" "{}" ""]; dann echo "'" {} "'"; fi '' user128063 vor 5 Jahren 0
0
tao

Platzieren Sie diese als letzte Zeile oder wo immer sie am besten zu Ihnen passt.
gedit ~ / .bashrc hoffe das hilft, Prost

#system only
slocate() { locate $@ | egrep -v ˆ/home ; }

#system directories only
dslocate() { for directory in `locate $@ | egrep -v ˆ/home`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }

#whole system directories only
dlocate() { for directory in `locate $@`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }

#local user's only
llocate() { locate $@ | egrep ˆ/home ; }

#local user's directories only
ldlocate() { for directory in `locate $@ | egrep ˆ/home`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }


0
shrx

I went with this solution:

locate -i "$foldername" | while read line do if [[ -d "$line" && `echo $ | tr [:upper:] [:lower:]` = *`echo $foldername | tr [:upper:] [:lower:]`* ]]; then echo "$line" fi done 
Kannst du erklären, was das Echo $ tut? user128063 vor 5 Jahren 0