it-swarm.com.de

Verwenden Sie "locate" unter einem bestimmten Verzeichnis?

Ich habe mich gefragt, wie ich den Suchbereich von "locate" auf ein bestimmtes Verzeichnis beschränken kann.

Wie kann man beispielsweise Dateien/Verzeichnisse mit der Zeichenfolge "math" in ihren Namen unter einem Verzeichnis "/ home/tim/science /" finden?

Danke und Grüße!

44
Tim

UPDATE: Ein Hinweis zur Verwendung der Regex-Option von locate im Vergleich zur Dateinamenerweiterung von locate in Bezug auf die Argumente von locate. ..

Shell FILENAME EXPANSION
Wenn Sie locate /bin/b* eingeben (beachten Sie, dass es keine Anführungszeichen gibt), passieren verschiedene Dinge.

  1. Erstens erweitert Shell-Dateinamenerweiterung das spezielle Shell-Musterzeichen * (Dies liegt daran, dass das * ungeschützt ist, dh dort sind keine "doppelten Anführungszeichen")
  2. Diese resultierende Erweiterung ist eine Liste der Dateinamen. was vielleicht sehr lang ist ... Diese Liste wird an locate so viele einzelne Kommandozeilenargumente übergeben.
  3. locate testet dann jede dieser Argumente gegen jede 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 es sowohl /bin/bashals auch/home/user/bin/brackets entspricht.
Sie haben auf diese Weise ein gewisses Maß an Kontrolle, aber die Regex-Suche von locate bietet mehr; wie auch einige andere Optionen von locate.

LOCATE'S REGEX OPTION
Wenn Sie locate -r "/bin/b.*" eingeben, passieren andere Dinge als mit einfachen Argumenten. ( Shell-expandierte Argumente sind nur eine Liste einfacher Argumente)

  1. Die Option -r weist an, locate als reguläres Muster zu behandeln.
  2. Die Anführungszeichen schützen das * vor der Dateinamenerweiterung der Shell. Es bedeutet, dass das * und der Punkt. sind jetzt Sonderzeichen
  3. 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.*" erzeugt Dateinamen, die mit / home/user/bin/b beginnen. Beachten Sie, dass das ~/nicht ​​durch "Anführungszeichen" geschützt ist und ist daher der Shell-Tilde-Erweiterung unterworfen, die ~/in/home/user/konvertiert

Fazit: "Shell Filname Expansion" ist ganz anders als "Regex"

Nun zurück zum ursprünglichen Beitrag:


locate listet normalerweise die gesamte Datenbank auf stdout auf. Um sie 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 locate : -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 kann ^ oder verwenden $ um eine Übereinstimmung am Anfang oder Ende eines Pfadnamens zu verankern. "

anmerkung: -i = Groß-/Kleinschreibung ignorieren
. . . . . -r = regulärer Ausdruck
. . . . . ~/wird von der Shell zu/home/user erweitert (wenn ~/nicht in Anführungszeichen steht)
. . . . . '\' (Schrägstrich + Leerzeichen; keine Anführungszeichen) ist ein wörtliches Leerzeichen (um die Shell-Erweiterung 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 die Suche auch auf die Datei beschränken Name, aber mit dem -b oder --basename .. In diesem Fall gilt der reguläre Zeilenanfang ^ nur zum Basisnamen ...

Am häufigsten benutze ich locate -bir

PS .. Locate ist so schnell, dass ich niefind verwendet habe ... noch habe ich Nautilus-Suche verwendet (zu langsam)

Wenn Sie mit 'locate' nach etwas suchen, das neu hinzugefügt wurde, führen Sie einfach Sudo updatedb aus, um die Datenbank von locate zu aktualisieren ... (aber wenn Sie es neu hinzugefügt haben, wissen Sie wahrscheinlich, wo es sich befindet :) .. ..

25
Peter.O

Pipe es durch grep, so

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless

Bearbeiten: Die andere Antwort ist besser, ich wusste nicht, dass Sie ein Muster übergeben können, um zu lokalisieren.

13
Adam Byrtek

Sie können locate /rootpath/*filenamespec verwenden. Ich hatte es noch nicht ausprobiert, aber es scheint zu funktionieren. Um dein Beispiel zu machen, wäre es locate /home/tim/science/*math*

Möglicherweise möchten Sie sich den Befehl find und nicht locate für diese Art von Verhalten ansehen. Die Syntax wäre find rootforsearch -name filenamepattern -print. In diesem Fall würde für Ihr Beispiel find /home/tim/science -name *math* -print erforderlich sein. Dies ist nicht so schnell möglich, da keine Datenbank zum Durchsuchen vorhanden ist. Das Dateisystem wird tatsächlich durchsucht. Es gibt viele Optionen, die Sie außer Drucken auch verwenden können, wenn Sie beabsichtigen, tatsächlich etwas mit der Datei zu tun.

8
Nerdfest

Für mich ist das bequemste

cd /home/tim/science
locate math | grep `pwd`
0
alex440