Erlaubt mdfind Wildcard-Suchen nach Dateinamen?

Ich versuche herauszufinden, wie ich mit mdfind unter OsX Platzhaltersuchen nach Dateinamen durchführen kann. Ich habe es versucht: mdfind -name "*.pdf"aber es hat nicht funktioniert.

BEARBEITEN: Ich möchte Namen wie "test*.pdf" finden können

mdfindist so ein Schmerz zu benutzen! Als Alternative ist locatees vorinstalliert, wenn Sie also den Index (mit sudo /usr/libexec/locate.updatedb) synchronisieren, können Sie ihn stattdessen verwenden und vermeiden, die mdfindSyntax zu lernen. Der große Nachteil ist natürlich, dass Sie manuell synchronisieren müssten. Siehe auch developer.apple.com/library/mac/documentation/Darwin/Reference/… NB: Nur zur Klarstellung: locateSpotlight wird nicht verwendet, aber für Linux-Benutzer wäre es wahrscheinlich vertrauter.
Unten ist eine Pseudolokalisierung, die mdfind verwendet, die Sie Ihrer Bash-Initialisierung hinzufügen können. function mdname () { if [ $1 = "-i" ]; then shift mdfind "kMDItemDisplayName == '$@'c" else mdfind "kMDItemDisplayName == $@" fi }- das Beste aus beiden Welten, obwohl es durch die Unfähigkeit, formatierten Code zu Kommentaren hinzuzufügen, durcheinander gebracht wurde, sodass Sie ;'s oder neue Zeilen wie im Original hinzufügen müssten, wo diese großen Lücken sind.
@ccpizza Leider wird das locate, das mit macOS geliefert wird, als ausgeführt nobodyund kann keine Ordner durchsuchen, für die dieser Benutzer keine Berechtigungen hat. Sie können anscheinend Homebrew verwenden, um GNU Locate zu installieren. Siehe: stackoverflow.com/questions/15887431/…
können Sie einfach 'ls *.pdf' aus einem ausreichenden Verzeichnis verwenden? Die Optionen von ls vor Dateinamen bestimmen Ihre Ausgabe.
Beachten Sie, dass locatedie Datenbank nicht bei jeder Änderung des Dateisystems aktualisiert wird, wie es spotlight/mdfind tut. Es wird normalerweise einmal pro Woche aktualisiert, glaube ich, daher ist es möglicherweise nicht für einige unmittelbarere Aufgaben geeignet.

Antworten (4)

Das sollte funktionieren:

mdfind "kMDItemDisplayName == test*.pdf"

Schließen Sie das Muster in einfache Anführungszeichen ein und fügen Sie „c“ hinzu, um die Groß-/Kleinschreibung zu beachten:

mdfind "kMDItemDisplayName == 'test*.pdf'c"

Hier ist eine Liste der verfügbaren Attribute. Sie können mehrere Attribut/Wert-Paare mit kombinieren &&.

Ich konnte nur mdfindarbeiten, wenn der Platzhalter am Anfang oder Ende des Namens stand. Also test*.pdfmusste ich es stattdessen kludge mdfind "kMDItemDisplayName == 'test*' | grep pdf. (Noch besser, Pfeife zu grep \\.pdf$.) Seufz.
Ups, ein fehlendes doppeltes Anführungszeichen in meinem vorherigen Kommentar; für Copypastability: mdfind "kMDItemDisplayName == 'test*'" | grep pdf.
FWIW das * im Namen hat bei mir gut funktioniert

macOS wird mit dem regulären findBefehl ausgeliefert und mdfindist kein Ersatz für find.

Wenn Sie wirklich nur das aktuelle Verzeichnis nach allen PDF-Dateien durchsuchen möchten, sollten Sie dies wahrscheinlich tunfind . -name '*.pdf'

Standardmäßig mdfindwird nach Dateiinhalten und Metadaten gesucht, und es durchsucht Ihre gesamte Festplatte statt nur eines einzelnen Verzeichnisses – auf meinem System werden mdfind pdfZehntausende von Ergebnissen gefunden.

Wenn Sie mdfind verwenden müssen, weil es schneller ist, haben Sie einige Optionen, um die Ergebnisse einzuschränken, zum Beispiel:

mdfind pdf -onlyin .
mdfind 'kMDItemFSName = *.pdf' -onlyin .
mdfind 'kMDItemContentTypeTree = *.pdf' -onlyin .

Verwenden Sie mdls, um zu erfahren, welche Metadaten für eine Datei verfügbar sind, und die Syntax für den Musterabgleich ist sehr minimalistisch, da sie mit dem Datenbankindex Ihres Dateisystems übereinstimmen muss.

Alternativ können Sie mdfindmit grepdie Geschwindigkeit mdfindund den vollständigen Regex-Abgleich im Dateipfad angeben. Zum Beispiel:

mdfind pdf -onlyin . | grep 'pdf$'

Ein letzter Vorbehalt ist mdfind, dass nicht Ihr eigentliches Dateisystem durchsucht wird, sondern nur die Spotlight-Datenbank, in der möglicherweise Teile des Dateisystems fehlen oder die ungenau sind. Verwenden findSie es, wenn Sie zuverlässige Ergebnisse benötigen. Verwenden Sie diese Option mdfind, wenn Geschwindigkeit wichtiger als Genauigkeit ist und wenn Sie komplizierte Suchbegriffe benötigen (z. B. alle PDF-Dateien finden, die innerhalb eines bestimmten Datumsbereichs erstellt wurden und eine Textphrase enthalten).

Bei der expliziten Suche nach Dateinamen liefert das kMDItemFSNameAttribut meiner Erfahrung nach prägnantere Ergebnisse. Ein weiterer Vorschlag: Fügen Sie den dVergleichsmodifikator hinzu (unempfindlich gegenüber diakritischen Zeichen), um beispielsweise eine Datei mit dem Namen "Entrée Menu.pdf" bei der Suche nach " entree" abzugleichen :

mdfind 'kMDItemFSName == "*entree*"cd'

Da außerdem der Link von @tcmb zur Attributreferenz tot ist, sind hier zwei funktionierende: Spotlight Metadata Attributes und iCloud Metadata Attributes .

Wenn Sie häufig Spotlight verwenden möchten, um nach Dateinamen nach Glob-Mustern zu suchen, lohnt es sich möglicherweise, dies in ein Skript zu verpacken, indem Sie diesen Code in einem mdfindfileauf Ihrem Pfad speichern:

#!/usr/bin/env bash
# case-insensitive search for $1, maybe in dir $2
case "$#" in
    0) echo "usage: $(basename $0) PATTERN [DIR]"
       echo ""
       echo "  Lists paths of files matching PATTERN in DIR or below"
       ;;
    1) exec mdfind "kMDItemDisplayName == '$1'c"
       ;;
    *) exec mdfind "kMDItemDisplayName == '$1'c" -onlyin "$2"
       ;;
esac

Dann können Sie einfach mdfindfile "*.pdf"Ihren Computer mdfindfile "*.pdf" ~/Documentsdurchsuchen oder unter Ihren Dokumenten suchen oder was auch immer.