(Ich gehe hier von GNU find
aus)
Mit just
find filename
wäre schnell, weil es nur zurückkehren würde filename
, oder die Namen darin, filename
wenn es ein Verzeichnis ist, oder ein Fehler, wenn dieser Name nicht im aktuellen Verzeichnis vorhanden wäre. Es ist eine sehr schnelle Operation, ähnlich wie ls filename
(aber rekursiv, wenn filename
es sich um ein Verzeichnis handelt).
Im Gegensatz,
find | grep filename
würde es ermöglichen find
, eine Liste aller Namen aus dem aktuellen Verzeichnis und darunter zu generieren , die grep
dann filtern würde. Dies wäre offensichtlich eine viel langsamere Operation.
Ich gehe davon aus, dass das, was eigentlich beabsichtigt war, war
find . -type f -name 'filename'
Dies würde filename
als Name einer regulären Datei irgendwo im aktuellen Verzeichnis oder darunter suchen .
Dies ist so schnell (oder vergleichsweise schnell) wie find | grep filename
, aber die grep
Lösung würde mit filename
dem vollständigen Pfad jedes gefundenen Namens übereinstimmen , ähnlich wie dies der Fall -path '*filename*'
wäre find
.
Die Verwirrung rührt von einem Missverständnis darüber her, wie es find
funktioniert.
Das Dienstprogramm verwendet eine Reihe von Pfaden und gibt alle Namen unter diesen Pfaden zurück.
Sie können dann die zurückgegebenen Namen mithilfe verschiedener Tests einschränken, die sich auf den Dateinamen, den Pfad, den Zeitstempel, die Dateigröße, den Dateityp usw. auswirken können.
Wenn du sagst
find a b c
Sie fragen find
jeden Namen unter den drei Wege zur Liste a
, b
und c
. Wenn dies zufällig Namen von regulären Dateien im aktuellen Verzeichnis sind, werden diese zurückgegeben. Wenn einer von ihnen zufällig der Name eines Verzeichnisses ist, wird er zusammen mit allen weiteren Namen in diesem Verzeichnis zurückgegeben.
Wenn ich es tue
find . -type f -name 'filename'
Dadurch wird eine Liste aller Namen im aktuellen Verzeichnis ( .
) und darunter generiert . Dann beschränkt es die Namen auf die von regulären Dateien, dh nicht auf Verzeichnisse usw., mit -type f
. Dann gibt es eine weitere Einschränkung für Namen, die mit filename
using übereinstimmen -name 'filename'
. Die Zeichenfolge filename
kann ein Dateinamen-Globbing-Muster sein, z. B. *.txt
(denken Sie daran, es zu zitieren!).
Beispiel:
Folgendes scheint die .profile
in meinem Home-Verzeichnis aufgerufene Datei zu "finden" :
$ pwd
/home/kk
$ find .profile
.profile
Tatsächlich werden jedoch nur alle Namen im Pfad zurückgegeben .profile
(es gibt nur einen Namen, und das ist von dieser Datei).
Dann steige ich cd
eine Ebene höher und versuche es erneut:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
Der find
Befehl kann jetzt keinen aufgerufenen Pfad finden .profile
.
Wenn ich es jedoch dazu bringe, das aktuelle Verzeichnis zu betrachten und dann die zurückgegebenen Namen auf nur zu beschränken.profile
, findet es es auch von dort:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile