Regex-Matching mit "lokalisieren"

8

Ich versuche, mit dem Befehl "find" Dateien in meinem Home-Ordner zu finden. Wenn ich jedoch versuche, dies auszuführen, erhalte ich keine Ergebnisse:

locate -i -l 4 --regexp '^\/home\/jack\/[A-Za-z0-9\/\ ]*(My.)*$'

Ich habe es auch versucht, ^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$aber das liefert auch keine Ergebnisse.

Die Datei, nach der ich suche, um sie zu testen, ist /home/jack/Music/Foals/My Number.flac

Ich möchte die Ergebnisse versteckter Dateien von meiner Suche ausschließen.

Jack Jones
quelle
2
Ich bin nicht vertraut mit locate. Ist es sinnvoll, -beinen Pfad in zu kombinieren (dh "Nur den Basisnamen mit den angegebenen Mustern abgleichen") --regexp? Warum entkommst du dem /s?
Hauke ​​Laging
Es tut mir leid, dass ich einen Regex-Builder verwendet habe, der mir geraten hat, diesen Charakteren zu entkommen, und ich denke, Sie haben Recht mit der -b-Flagge. Ich werde sie jetzt loswerden
Jack Jones,
1
Was (My.)*soll tun? My.*$funktioniert. Sie müssen ()in grundlegenden REs entkommen .
Hauke ​​Laging
1
Sie verwenden einen erweiterten regulären Ausdruck. --regexpNimmt aber eine grundlegende Regex. Versuchen Sie, --regexpzu --regex(nein p) zu wechseln . Die Manpage sagt, dass --regexes einen erweiterten Regex-Abgleich gibt.
Mikel

Antworten:

6

Dies scheint den Job zu machen.

locate -ir '^/home/jack/\([^.][^/]\+/\)\+My[^/]*$'

Zitate aus dem Handbuch:

-i, --ignore-case Ignoriert Groß- und Kleinschreibung, wenn Muster abgeglichen werden.

-r, --regexp REGEXP Suche nach einem grundlegenden Regexp REGEXP. Wenn diese Option verwendet wird, sind keine MUSTER zulässig. Diese Option kann jedoch mehrfach angegeben werden.

Graeme
quelle
Unter Linux, mlocate 0.26-1ubuntu2 (Ubuntu 16.04 LTS Xenial Xerus, Stand 05.02.2018), gibt der Befehl den folgenden Fehler zurück: "Lokalisieren: Nichtoptionsargumente sind mit --regexp nicht zulässig". mlocate ist das eigentliche Paket (/ usr / bin / Locate ist ein Symlink zu mlocate).
Hans Deragon
1

Wie das Auffinden funktioniert

Der Index der Dateien, die der locateBefehl verwendet, wird normalerweise nur einmal am Tag neu erstellt. Es ist von diesem Cron Job gebaut /etc/cron.daily/mlocate. Ihre Einträge sind also wahrscheinlich noch nicht da. Sie können es erneut ausführen, wenn Sie möchten, dass diese Indizes manuell neu erstellt werden.

$ sudo /etc/cron.daily/mlocate

Mit find

Es ist jedoch wahrscheinlich besser, einen Befehl findzu verwenden, um beispielsweise Dateien in Ihrem Home-Verzeichnis zu suchen.

$ find ~ -iname "[^.]*" | head -10
/home/saml
/home/saml/isql_issue.txt
/home/saml/bbbb
/home/saml/script_name.sh
/home/saml/go_figure_book
/home/saml/go_figure_book/readme.txt
/home/saml/go_figure_book/lstopo.txt
/home/saml/go_figure_book/who_breaks_out.bash
/home/saml/hdat2
/home/saml/hdat2/hdat2_v50.iso

Verwenden einer GUI

Möglicherweise interessiert Sie auch ein grafisches Suchwerkzeug. Schauen Sie sich dieses andere U & L-Q & A mit dem Titel: GTK Frontend an, um herauszufinden, welches ein solches Tool namens Catfish abdeckt. Dieses Tool kann sowohl locateDaten als auch findBefehle verwenden.

slm
quelle
1
Ich finde oft locateschneller als findselbst wenn ich eine updatedberste machen muss. Solange die Datenbank auf den meisten Systemen bereits einigermaßen aktuell ist, dauert updatedbes nicht lange. Die Suchsyntax ist in diesem Fall jedoch wahrscheinlich einfacher.
Graeme
Ja, ich habe es auch täglich verwendet, es ist nur auf Servern, auf denen ich Skripte schreibe, zu denen ich oft wechsle find.
Slm
Ja, hätte "die meisten Desktop-Systeme" setzen sollen
Graeme
1

Sie können auch einen anderen Ansatz wählen:

locate "My file" | grep '/home/jack' | grep -v '/\.'

Ich bin mir nicht sicher, was Sie versuchen zu tun. Sie sind die mit -iFlagge es Groß- und Kleinschreibung und Ihre regex zu machen , ist nicht sehr spezifisch, Sie scheinen oben wollen , dass alle Dateien oder Ordner zu finden , die unter sind /home/jackenthalten und die MY, My, myoder mYirgendwo im Dateinamen. Wenn ja, laufen Sie einfach

locate -i my | grep '/home/jack' | grep -v '/\.'
terdon
quelle
0

Dies sollte funktionieren - stimmt nur mit nicht versteckten Dateien und Ordnern überein:

find /home/jack -name "[^.]*My.*"

Noch einfacher: Dies entspricht Dateien, die nirgendwo im Verzeichnisbaum versteckte Verzeichnisse haben. Wahrscheinlich ist es das, was Sie wollen:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done
jayhendren
quelle
Ich würde es vorziehen, es zu verwenden locate, da ich versuche, es in eine Python-GUI zu integrieren, um während der Eingabe zu suchen, und es ist schneller. Danke trotzdem!
Jack Jones
@ JackJones Sie müssen nicht einmal locatedie Ergebnisse beschleunigen. ZB:echo /home/jack/**/*My.*
Jayhendren