Wie lassen sich Dateidetails (Größe, Datum usw.) über den Linux-Befehl "locate" anzeigen?

37819
Dave Burton

Der (langsame) Linux-Befehl "find" hat die Option "-ls", um Größe, Datum usw. anzuzeigen, beispielsweise den Befehl "ls -l". Aber der Befehl "locate" scheint das nicht zu haben. Wie kann ich die entsprechende Funktionalität mit locate erhalten?

Ich habe Back-Ticks verwendet, um die Ausgabe von locate wie folgt an ls zu übergeben:

ls -al `locate -e somefile` 

… Was funktioniert, solange ein File existiert. Wenn jedoch keine Datei existiert, erhalten Sie eine vollständige Verzeichnisliste.

Wenn ich das mache:

ls -al `locate -e somefile` thisfileneverexists 

… Dann funktioniert es irgendwie, wenn Sie die Fehlerzeile nicht stört:

ls: cannot access thisfileneverexists: No such file or directory 

… Was uns zu der offensichtlichen, aber äußerst hässlichen Problemumgehung führt:

ls -al `locate -e somefile` thisfileneverexists 2>/dev/nul 

Das funktioniert, aber es gibt sicherlich einen besseren Weg!

5

3 Antworten auf die Frage

11
Paul

Verwenden xargs. Dies nimmt eine Reihe von Parametern als Eingabe und führt eine Operation an diesen aus:

 locate -eb0P somefile | xargs -r0 ls -ald 

xargs führt den ls -aldBefehl unter Verwendung der Ergebnisse von locate als Parameter aus.

Die -eOption weist locate an, zu überprüfen, ob in der Datenbank gefundene Dateien tatsächlich vorhanden sind, und ignoriert alle Dateien, die dies nicht tun.

Der -bSchalter weist locate an, nur Basenamen zu finden.

Die -0(Null) -Schaltfläche weist locate an, Null-Trennzeichen anstelle von Leerzeichen zu generieren (damit Dateinamen behandelt werden können, die Leerzeichen enthalten).

Der -PSchalter weist locate an, gebrochene Symlinks aufzulisten

Der -rSchalter weist xargs an, den Befehl nicht auszuführen, wenn nichts übergeben wird, dh wenn der Suchvorgang nichts zurückgibt.

Der -0Schalter teilt xargs mit, dass als Trennzeichen Nullen anstelle von Leerzeichen erwartet werden

Der -aSchalter weist ls an, auch Dateien aufzulisten, die mit "." Beginnen.

Der -dSchalter weist ls an, Verzeichnisse und nicht deren Inhalt aufzulisten

Leider bricht dies bei Dateien mit Leerzeichen in den Namen und auch bei Verzeichnisnamen, die dem Muster entsprechen. Dies funktioniert besser: "locate -eb0 somefile | xargs -r --null ls -ald" Die Optionen bedeuten: locate -e = nur Dateien, die tatsächlich vorhanden sind. -B = Übereinstimmung mit dem Basisnamen. -0 = null Trennzeichen anstelle von Leerzeichen. Xargs - -null = erwartet keine Trennzeichen anstelle von Leerzeichen. ls -d = listet Verzeichnisse auf und nicht deren Inhalt. -a = listet auch versteckte Dateien auf (deren Namen mit "." beginnen). Dave Burton vor 11 Jahren 0
+1: Das ist Gold. Es ist die Art und Weise, wie ich _want_ `locate` arbeiten soll, da das Finden einer Datei nicht immer genug ist. Manngo vor 6 Jahren 0
3
Ignacio Vazquez-Abrams

Store the result of locate in a variable, check to see if it has any value, and then view that.

f=`locate ...` [ "$f" ] && ls -al "$f" 

The reason you can't get this information from locate directly is because it's not in the database that locate uses.

0
terdon

Sie können auch die locateAusgabe durchlaufen :

locate somefile | while IFS= read -r i; do ls -la "$i"; done