Befehl find unter Linux zum Suchen von PDF-Dateien

11

Mein Ziel ist es, alle PDF-Dateien auf einem Remote-Computer zu finden, daher greife ich auf den nützlichen Befehl zurück find. Also tippe ich

find ~ * .pdf
oder
find ~ "* .pdf"
und ich bekomme nichts. Ich mache das gleiche auf meiner Maschine und bekomme nichts. Ich suche regelmäßig über das Menü auf meinem Computer und finde einige PDF-Dateien. Würde mir bitte jemand sagen, was ich falsch mache?

Akira
quelle
11
Behalten Sie Ihre negativen Meinungen außerhalb Ihrer Frage, wenn Sie eine gute Antwort wünschen. In einer verwandten Geschichte findist alles andere als nutzlos.
Wilhelmtell
8
Natürlich haben Sie das Recht auf freie Meinungsäußerung. Aber du willst doch eine gute Antwort, oder? Nein, Sie haben kein Recht auf eine gute konstruktive Antwort. Das ist ein Privileg.
Wilhelmtell
2
Ein schlechter Arbeiter macht immer seine Werkzeuge dafür verantwortlich. Mit anderen Worten, hier reines PBCAK .
Pascal Thivent
5
@Wilhelmtell, ich denke, Martins Aussage ist fair - der Befehl hätte niemals "find" heißen dürfen, eher wie "walkpath_and_execute" ... er hat nicht die intuitivste oder benutzerfreundlichste Oberfläche und macht weit mehr als einfach Dateien finden. Der einfache Name "find" täuscht insofern, als er eine einfache Schnittstelle vorschlägt, die er nicht hat. Sicher, find ist
alles
1
@ Michael Ich habe hier niemanden beschuldigt; oder besser gesagt, ich war nicht derjenige, der hier die Schuld trägt. Ich habe nicht einmal gesagt, dass findes intuitiv ist. Ich könnte das wahrscheinlich auch in einem schöneren Ton sagen; manchmal reagiere ich auf (dumme) negative Kommentare.
Wilhelmtell

Antworten:

30

findist alles andere als nutzlos. Sie verwenden es einfach nicht richtig.

Versuchen:

find . -type f -iname '*.pdf'

Mitch Dempsey
quelle
@Martin - Gerne helfen wir Ihnen, markieren Sie die Frage als beantwortet!
Mitch Dempsey
@stepancheg Ja, warum schaltest du nicht das Internet aus und druckst eine Hardcopy aus?
Bobobobo
9

Schauen Sie sich die Dokumentation für die Findutils an . Der findBefehl ist unglaublich mächtig und hat folglich eine etwas komplizierte Oberfläche. Sie können tun, was Sie wollen mit:

find . -type f -iname '*.pdf' 

Der obige Befehl bedeutet "innerhalb von finden. Für Einträge vom Typ Datei mit einem Namen ohne Berücksichtigung der Groß- / Kleinschreibung, der mit * .pdf übereinstimmt (und den Namen solcher Übereinstimmungen drucken)". Der Befehl find kann tatsächlich verwendet werden, um Befehle für die gefundenen Dateien auszuführen (anstelle oder zusätzlich zum Drucken der Dateinamen). Für Ihre Zwecke sind Sie jedoch möglicherweise mit dem Befehl " locate" besser vertraut. Dies setzt das Auffinden von Dateien sehr einfach, vorausgesetzt, Sie haben die Lokalisierungsdatenbank mit updateedb erstellt . Zum Beispiel:

locate '*.pdf'

Sie werden auch feststellen, dass der Befehl find normalerweise schneller ist als der Befehl find, da locate einen Index von Dateinamen (die Lokalisierungsdatenbank) verwendet, während find die Hierarchie für jeden Aufruf durchläuft.

Michael Aaron Safyan
quelle
6

Sie vermissen einfach das Prädikat, das sagt, wonach Sie suchen (z -name. B. )

So finden Sie im Home-Verzeichnis nach Namen:

find ~ -name \*.pdf

Beachten Sie, dass der Platzhalter maskiert werden *muss, damit die Shell ihn nicht interpretiert, bevor find ihn in die Hände bekommt. Die Verwendung von '*.pdf'und "*.pdf"hat den gleichen Effekt wie \*.pdf.

So unterscheiden Sie zwischen Groß- und Kleinschreibung:

find ~ -iname \*.pdf

Um die Ergebnisse nur auf Dateien zu bereinigen (der Namensausdruck wird dies wahrscheinlich für Sie erledigen, aber nur für den Fall, dass Sie Verzeichnisse mit seltsamen Namen haben):

find ~ -type f -iname \*.pdf

Um sicherzustellen, dass find folgenden symbolischen Links folgt (ich möchte dies normalerweise selbst tun, wenn ich suche):

find ~ -follow -type f -iname \*.pdf

So tun Sie etwas mit den gefundenen Dateien: Sie können diese mithilfe der Standardumleitung (z. B. am > filenameEnde anheften ) in eine Datei kopieren oder die -execOption zum Ausführen eines Befehls verwenden (Einzelheiten finden Sie in der Manpage). Letzterer führt jedoch jeweils einen Befehl für jede Datei aus. Es ist oft schneller, den xargsBefehl Ihre gefundenen Dateien als Argumente an einen anderen Befehl übergeben zu lassen, alles auf einmal oder große Teile gleichzeitig. Zum Beispiel für Ad-hoc-Greps (aber nicht indizierte) Greps durch Header-Dateien:

find ~ -follow -type f -name \*.h | xargs grep -nH "identifier"

Und eine letzte Erweiterung, damit dieser letzte Befehl ordnungsgemäß funktioniert, wenn Sie Dateien und Verzeichnisse mit Leerzeichen haben:

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"
Owen S.
quelle
Tatsächlich würde "* .pdf" erweitert, wenn sich Dateien im aktuellen Verzeichnis befinden, die mit .pdf enden, oder? (kleine Anmerkung)
Peter Jaric
1
Nicht in Bash. Aus dem Bash-Handbuch: "Durch das Einschließen von Zeichen in doppelte Anführungszeichen wird der Literalwert aller Zeichen in Anführungszeichen beibehalten, mit Ausnahme von [Dollar], [Backquote], [Pipe] und, wenn die Verlaufserweiterung aktiviert ist, [Bang]. "" Versuchen Sie es selbst, um Folgendes zu bestätigen: ls "* .txt" in einem Verzeichnis mit Textdateien.
Owen S.
Ja, Sie haben natürlich Recht. Ich weiß nicht, woher ich diese Idee habe. Danke, dass du mich verbessert hast.
Peter Jaric
3

Schauen Sie sich dieses Tutorial an

Ich denke, was Sie tun wollen, ist

find . -name "*.pdf"

quelle
Sie sollten das inameAttribut für eine bessere Sicht auf den Flur verwenden
Mitch Dempsey
0

Ich habe den Fund mit grep like kombiniert

finden . . | grep -i ".pdf"

Vielleicht ist es nicht besonders effizient, aber es macht den Job gut.

Tiberiu Hajas
quelle
Dies kann finddirekt erfolgen, wenn Sie dies wünschen -iregex: find ~ -iregex '.*\.pdf'. Das Problem ist, dass finddas Muster so behandelt wird, als hätte es immer ein ^vorderes und ein $hinteres Muster, sodass Ihr Muster etwas komplizierter sein muss. Beachten Sie auch: .In Ihrem Muster handelt es sich tatsächlich um einen Platzhalter mit einem Zeichen, nicht um einen wörtlichen Punkt.
Owen S.
0

Suchen Sie nach Dateien, die Sie in den letzten x Tagen heruntergeladen haben

find ~ -type f -iname '*.pdf' -mtime -1

Sie finden PDF-Dateien in Ihrem Home- ~Verzeichnis und darunter mit Erweiterung, .pdfunabhängig von Groß- und Kleinschreibung (das ist ich in iname) und bis zu 1 Tag geändert, weil ich hinzugefügt habe mtime -1; Wenn Sie -60 in mtime eingeben, sind es die letzten 60 Tage.

r0berts
quelle
0

Um eine Suche innerhalb der "gefundenen" Dateien auszuführen, gibt es diese Konstruktion:

find <dir> -type f -iname <name> -exec grep -H <string> {} \;

Der Befehl exec muss mit dem Escapezeichen ";" enden. und das -H wird benötigt, damit grep den Dateipfad zusätzlich zu der Zeile in der Datei ausdrucken kann, in der sich "string" befindet.

Ted Ballou
quelle