(Ich gehe hier von GNU findaus)
Mit just
find filename
wäre schnell, weil es nur zurückkehren würde filename, oder die Namen darin, filenamewenn 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 filenamees 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 grepdann 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 filenameals 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 grepLösung würde mit filenamedem 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 findfunktioniert.
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 findjeden Namen unter den drei Wege zur Liste a, bund 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 filenameusing übereinstimmen -name 'filename'. Die Zeichenfolge filenamekann ein Dateinamen-Globbing-Muster sein, z. B. *.txt(denken Sie daran, es zu zitieren!).
Beispiel:
Folgendes scheint die .profilein 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 cdeine Ebene höher und versuche es erneut:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
Der findBefehl 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