UPDATE : Ein Hinweis zur Verwendung der Regex-Option von locate im Vergleich zur Dateinamenerweiterung der Shell in Bezug auf die Argumente von locate ...
ERWEITERUNG DES SHELL-DATEINAMENS
Bei der Eingabelocate /bin/b*
(es gibt keine Anführungszeichen) passieren verschiedene Dinge.
- Erstens erweitert die Dateinamenerweiterung der Shell das spezielle Shell-Musterzeichen * (Dies liegt daran, dass das * ungeschützt ist, dh es gibt keine "doppelten Anführungszeichen").
- Diese resultierende Erweiterung ist eine Liste von Dateinamen . was vielleicht sehr lang ist ... Diese Liste wird an
locate
möglichst viele einzelne Kommandozeilenargumente übergeben.
locate
testet dann jede dieser Argumente mit jeder der Dateien in seiner Datenbank und gibt Übereinstimmungen aus.
Beachten Sie jedoch, dass 'locate' kein Konzept für das aktuelle Arbeitsverzeichnis hat. Es werden nur Ihre Argumente mit den vollständig qualifizierten Dateinamen in der Datenbank verglichen.
Dies bedeutet, dass beide übereinstimmen, /bin/bash
und /home/user/bin/brackets
Sie haben auf diese Weise einen gewissen Grad an Kontrolle, aber die Regex-Suche von locate bietet mehr. wie auch einige andere Optionen von locate.
LOCATE'S REGEX OPTION
Wenn Sie etwas locate -r "/bin/b.*"
anderes eingeben , als mit einfachen Argumenten. ( Shell-expandierte Argumente sind nur eine Liste einfacher Argumente.)
- Die
-r
Option weist locate an, Ihr Argument als reguläres Muster zu behandeln.
- Die Anführungszeichen schützen das * vor der Dateinamenerweiterung der Shell. Es bedeutet, dass das * und der Punkt. sind jetzt spezielle Regex-Zeichen
- Als Regex können Sie 'locate' auf verschiedene Arten anweisen, mit seinem Datenbankeintrag übereinzustimmen: eg1.
locate -r "^/bin/b.*"
Erzeugt Dateinamen, die mit / bin / b ... eg2 beginnen. locate -r ~/"bin/b.*"
Dateinamen beginnend mit produziert / home / user / bin / b .. Beachten Sie, dass die ~ / ist nicht durch „Anführungszeichen“ geschützt und unterliegt daher einer Tilde-Erweiterung Shell , das umwandelt ~ / in / home / user /
Zusammenfassung: "Shell-Dateinamenerweiterung" unterscheidet sich erheblich von "Regex"
Nun zurück zum ursprünglichen Beitrag:
locate
listet normalerweise die gesamte Datenbank auf stdout auf. Um sie also auf ein bestimmtes Verzeichnis zu beschränken, müssen Sie sie filtern ... Sie können dies über die Optionen von locate tun.
Sie können die Regex-Funktion von locate verwenden, anstatt nur Shell-Globbing ... ( locate /dir/myfile*
ist Shell-Globbing) ...
Von info lokalisieren : -r
,--regex
- "... (reguläre Ausdrücke) Übereinstimmungen werden für den gesamten Pfadnamen ausgeführt, und daher wird standardmäßig ein Pfadname abgeglichen, wenn ein Teil davon mit dem angegebenen regulären Ausdruck übereinstimmt. Der reguläre Ausdruck verwendet möglicherweise ^ oder $ , um eine Übereinstimmung am zu verankern Anfang oder Ende eines Pfadnamens. "
Anmerkung: -i = Groß- / Kleinschreibung ignorieren
. . . . . -r = regulärer Ausdruck
. . . . . ~ / wird von der Shell zu / home / user erweitert (wenn ~ / nicht in Anführungszeichen steht)
. . . . . '\' (Strich + Leerzeichen; keine Anführungszeichen) ist ein wörtliches Leerzeichen (um die Erweiterung der Shell zu vermeiden). Sie können den String in Anführungszeichen setzen, aber achten Sie darauf, das ~ / außerhalb der Anführungszeichen zu lassen: ~/my\ regex
oder-/"my regex"
z.B. locate -ir ~/".*"la\ bella\ vita
ist dasselbe wie locate -ir ~/".*la bella vita"
und durchsucht Ihr gesamtes Home-Verzeichnis nach "La Bella Vita", das überall vorkommt.
Sie können auch die Suche nur auf die Datei beschränken Namen , aber der Verwendung -b
oder --basename
.. in diesem Fall die regex Start-of-line ^
gilt nur für die Basisnamen ...
Ich finde mich am häufigsten mit locate -bir
PS .. Locate
ist so schnell, dass ich noch nie verwendet habe find
... noch habe ich Nautilus-Suche verwendet (zu langsam)
Wenn Sie mit 'locate' nach etwas suchen, das neu hinzugefügt wurde, führen Sie einfach den Befehl aus sudo updatedb
, um die locate-Datenbank zu aktualisieren. (Wenn Sie es jedoch neu hinzugefügt haben, wissen Sie wahrscheinlich, wo es sich befindet.)
locate
eineO(log(n))
Suche beendet wird,locatedb
wenn Sie eine nicht reguläre Suchabfrage eingeben, können Sie die reguläre Suchabfrage verwenden,grep
um eineO(m)
Suche über die bereits reduzierten Unterergebnisse durchzuführen . (n = Gesamtzahl der Einträge inlocatedb
[dh in allen Dateien Ihres Laufwerks], m = Anzahl der Einträge , die weniger mit Ihrer übereinstimmenlocatedb
), Gesamtlaufkomplexität:O(log(n)) + O(m)
wobei m im Durchschnitt istlog(n)
, sodass Sie2*O(log(n))
im Gegensatz zuO(n)
Ihrer Leistung erhalten eine Regex-Abfrage über alle Einträge inlocatedb
.O(log(n))
während eine Regex-Suche so istO(n)
? Die Anzahl der Einträge in db ist jeweils gleich. Ich denke, es ist Suchalgorithmus?Du kannst es benutzen.
locate /rootpath/*filenamespec
Ich hatte es noch nie versucht, aber es scheint zu funktionieren. Um dein Beispiel zu machen, wäre eslocate /home/tim/science/*math*
Möglicherweise möchten Sie sich den
find
Befehl ansehen, anstatt sichlocate
um ein solches Verhalten zu kümmern . Die Syntax wärefind rootforsearch -name filenamepattern -print
. In diesem Fall würde Ihr Beispiel erfordern, dassfind /home/tim/science -name *math* -print
.Nicht so schnell gesucht wird, wie es keine zu durchsuchende Datenbank gibt ... es durchsucht tatsächlich das Dateisystem. Es gibt viele Optionen, die Sie außer Drucken auch verwenden können, wenn Sie beabsichtigen, tatsächlich etwas mit der Datei zu tun.quelle
locate
selbst nutzt (kein anderes Dienstprogramm wie erforderlichgrep
) und auf reguläre Ausdrücke verzichtet (was in diesem Fall nett, aber unnötig ist).Für mich ist das bequemste
quelle