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
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 &&
.
mdfind
arbeiten, wenn der Platzhalter am Anfang oder Ende des Namens stand. Also test*.pdf
musste ich es stattdessen kludge mdfind "kMDItemDisplayName == 'test*' | grep pdf
. (Noch besser, Pfeife zu grep \\.pdf$
.) Seufz.mdfind "kMDItemDisplayName == 'test*'" | grep pdf
.macOS wird mit dem regulären find
Befehl ausgeliefert und mdfind
ist 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 mdfind
wird nach Dateiinhalten und Metadaten gesucht, und es durchsucht Ihre gesamte Festplatte statt nur eines einzelnen Verzeichnisses – auf meinem System werden mdfind pdf
Zehntausende 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 mdfind
mit grep
die Geschwindigkeit mdfind
und 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 find
Sie 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 kMDItemFSName
Attribut meiner Erfahrung nach prägnantere Ergebnisse. Ein weiterer Vorschlag: Fügen Sie den d
Vergleichsmodifikator 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 mdfindfile
auf 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" ~/Documents
durchsuchen oder unter Ihren Dokumenten suchen oder was auch immer.
ccpizza
mdfind
ist so ein Schmerz zu benutzen! Als Alternative istlocate
es vorinstalliert, wenn Sie also den Index (mitsudo /usr/libexec/locate.updatedb
) synchronisieren, können Sie ihn stattdessen verwenden und vermeiden, diemdfind
Syntax 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:locate
Spotlight wird nicht verwendet, aber für Linux-Benutzer wäre es wahrscheinlich vertrauter.jwd630
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.noch nicht
locate
, das mit macOS geliefert wird, als ausgeführtnobody
und 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/…Natsfan
Josua Goldberg
locate
die 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.