Wie finde ich eine Datei anhand des Dateinamens im Mac OSX-Terminal?

118

Ich möchte mit dem Dateinamen eine Datei auf meinem MacBook finden: abc.dmg. Ich habe versucht, Spotlight zu verwenden, aber es wird nicht gefunden. Als ich find ausprobiert und verwendet habe find -name abc.dmg -path /, habe ich Fehler zurückbekommen.

Was ist die richtige Syntax, um eine Datei anhand des Dateinamens mit dem Befehl find auf einem Mac OSX-Terminal zu finden?

SPRBRN
quelle
1
@VxJasonxV Apple-Fragen sind zu 100% ein Thema für Superuser, und es ist nicht unbedingt erforderlich, dass jede Apple-Frage dorthin verschoben wird. iPhone- oder iPad-Fragen werden jedoch bei Bedarf verschoben.
BinaryMisfit
Es war nicht so sehr ein Grund, nicht zum Thema zu gehören, sondern die Tatsache, dass es ein spezifischeres Thema / eine spezifischere Site für dieses allgemeine Thema gibt.
VxJasonxV
@Diago: Wurde diesbezüglich auf Meta oder im Chat diskutiert? Ich frage mich nur, weil AFAIK apple.SE bald aus der Beta rauskommt, also wäre es schön, wenn alle auf die gleiche Seite kämen.
Robert S Ciaccio
1
@calavera. Eine ziemlich alte, aber relevante Diskussion finden Sie hier . Apple SE, Ubuntu SE und Linux SE sind allesamt dazu da, Super User zu beglückwünschen, aber wir möchten die Benutzer in keiner Weise zum Umzug zwingen. Ich stelle hier lieber meine Apple-Fragen als Apple, da ich 3 verschiedene Betriebssysteme verwende. Wenn ich eine ganz bestimmte Frage habe, werde ich sie auf einer spezielleren Website stellen.
BinaryMisfit

Antworten:

163

Nimmt in seiner einfachsten Form findeinen Parameter: den Pfad. In seiner tatsächlich nützlichen Form folgt es dem Pfad, dem die Einengungskriterien folgen.

So möchten Sie:

  • find (das Programm)
  • / (der Pfad) und
  • -name abc.dmg (das Kriterium).
find / -name abc.dmg
VxJasonxV
quelle
12
Beim Durchsuchen des gesamten Laufwerks erhalten Sie möglicherweise Fehler vom Typ "Zugriff verweigert", die jedoch ignoriert werden können, es sei denn, Sie erwarten, dass sich die Datei in einem eingeschränkten Ordner befindet. Verwenden Sie in diesem Fall sudo find / -name abc.dmg
Chris Nava
Versuchte es, aber kein Ergebnis.
SPRBRN
6
Vermutlich haben Sie dann keine Datei mit dem Namen abc.dmg auf Ihrem Computer. Sie können -iname anstelle von -name verwenden, um die Groß- und Kleinschreibung der Suche zu ignorieren. Ich bezweifle sehr, dass Sie tatsächlich nach "abc.dmg" suchen, und angesichts dieser (vermutlich) Tatsache ist es schwierig, Ihnen zu sagen, was Ihr Problem ist, ohne die tatsächlichen Details zu kennen.
VxJasonxV
2
@ rxt: Wenn find dooes nicht finden, ist es nicht da ...
Robert S Ciaccio
5
Da OP - Bericht findet in dem Fragetext versucht hat, es ist erwähnenswert , dass die Reihenfolge der Argumente zu find Angelegenheiten . Wenn muss sein find [path]+ [selection, grouping, and actions].
dmckee
23

find . -name '*.csv'Zum Beispiel arbeitete für mich mit Wildcards. OP könnte auch verwenden find . -name '*.dmg', um sein aktuelles Verzeichnis zu überprüfen, vorausgesetzt, er befand sich in /.

pjammer
quelle
6

Sie können den locateBefehl verwenden.

locate abc.dmg
Wuffers
quelle
2
Beachten Sie das osxTag. slocate db wird standardmäßig nicht gefüllt.
VxJasonxV
Versuchte es, nach dem Erstellen der Datenbank, aber kein Ergebnis.
SPRBRN
wenn locateund mdfindbeide ausfallen, stehen die Chancen, die Datei nicht auf Ihrem Computer ist. Oder es ist nicht benannt, wie Sie denken, es ist benannt. Vielleicht ist die Suche nach ALLEN DMGs Ihr nächster Schritt?
Peelman
3

Der einfachste Weg (ich bin mir sicher, dass Sie es bereits versucht haben, aber hey, lassen Sie es mich trotzdem zum Thread hinzufügen) ist, abc.dmg in das Suchfeld oben rechts in einem Finder-Fenster einzugeben und dann "Datei" auszuwählen "Name" aus den Optionen in der angezeigten Suchleiste.

Das Terminal wird nicht benötigt.

Denken Sie auch daran, dass Spotlight nur Verzeichnisse indiziert, die in der Spotlight-Systemsteuerung angegeben sind, und abc.dmg sich möglicherweise nicht in einem dieser Verzeichnisse befindet.

Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, der Befehl find muss wissen, was ausgegeben werden soll:

find / -name abc.dmg -print

... sollte alle Ergebnisse auf dem Terminal ausgeben (einschließlich Berechtigungsfehlern).

Wenn Sie keine Berechtigungsfehler möchten und andere Benutzerverzeichnisse durchsuchen möchten, gehen Sie wie folgt vor:

sudo find / -name abc.dmg -print
Jupiter
quelle
2

Sie können die folgenden Befehlszeilenfunktionen verwenden, um relevante Dateien schnell zu finden und zu öffnen. Ich finde das einfacher, als lange Zeichenfolgen von Abfragen in das Spotlight-Fenster einzugeben.

Fügen Sie folgende Funktionen hinzu ~/.bash_aliases.

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Nun kann man entweder source ~/.bash_aliasesein neues Terminal laden oder Funktionen öffnen. Gehen Sie wie folgt vor, um nach Dateien mit Wörtern, Kreisen und 2016 an einer beliebigen Stelle im Dateinamen zu suchen

spot pie*2016 #or
spot 2016*pie

Es ist nicht erforderlich, *Ihrer Abfrage ein Präfix oder einen Anhang als Suchmuster hinzuzufügen, da die Platzhalter '*$1*'am Anfang und Ende der Abfrage bereits markiert sind. Außerdem cdwerden bei Groß- und Kleinschreibung fredkeine diakritischen Zeichen angezeigt , z. B. werden sowohl Frédéric als auch FrEDeric zurückgegeben.

findpaperschränkt die Suche auf Ergebnisse unter einem bestimmten Pfad ein (rekursiv), während openpaper pie*201ein Suchergebnis (oder das erste von mehreren Ergebnissen) oder openpaper pie*201 3der dritte Ergebniseintrag geöffnet wird. Um das Öffnen von Bash-Skripten oder anderen Nicht-Dokument-Dateien zu vermeiden, können Sie den Dateiinhalt durch zusätzliche Suchattribute einschränken. Weitere Informationen zur Verwendung anderer Suchoperatoren finden Sie unter Syntax von Abfrageausdrücken für Dateimetadaten und https://ss64.com/osx/mdfind.html .

Samir
quelle
Genial!
Standbild
0

Erfassen Sie eine Liste aller Dateien auf Ihrer Festplatte als root von /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Durchsuchen Sie die gesamte Datei mit grep, um das gesamte Laufwerk zu durchsuchen:

cat ~/file-list.txt | grep abc.dmg

Verwenden Sie reguläre Ausdrücke, um nur JPG- und DMG-Dateien anzuzeigen:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Ergebnis:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

...usw. Leider werden auch alle gemounteten Datenträger erfasst, so dass die Time Machine-Datenträger mit vielen Links am besten ausgeworfen werden können. Also renne ich in einem anderen Fenster, watch tail -n 10 ~/file-list.txtdas mir zeigt, wo es in meinem düsteren Hack liegt!

Tomachi
quelle
1
Schlechte Praktiken oder Dinge, die einen Kommentar verdienen: (1) sudo find / > ~/file-list.txtscheint besser zu sein, als die gesamte Shell als root auszuführen. (2) find *überspringt versteckte (Punkt-) Objekte (falls vorhanden) in /. (3) &>ist ein Bashismus. (4) Nutzlose Verwendung von cat. (5) grep abc.dmgdruckt zB /foo/bar/123abcXdmg456/baz/whatever. // Eine gute Sache, die Ihre Antwort auf diesen Thread bringt (und die andere Antwort nicht), ist der Ansatz, bei dem der Benutzer findeinmal ausgeführt wird und das gespeicherte Ergebnis dann mehrmals wiederverwendet, ohne die Dateisysteme immer wieder abzufragen. Dieser potenzielle Vorteil wird jedoch nicht betont.
Kamil Maciorowski
Guter Punkt, danke Kamil, habe das getan und auch $ (whoami)
Tomachi