Warum wird find
ein ./
Ergebnis ausgegeben, wenn keine Pfade angegeben wurden?
$ find
./file1
./file2
./file3
Was ist der Grund, warum das nicht ausgedruckt wird?
$ find
file1
file2
file3
Der Grund , warum diese sehen ist , weil die Entwickler von GNU wählten für ein „vernünftiges“ Verhalten zu liefern , wenn kein Pfad angegeben wird. Im Gegensatz dazu gibt POSIX nicht an, dass der Parameter optional ist:find
find
Das
find
Dienstprogramm führt die Verzeichnishierarchie von jeder durch den Pfad angegebenen Datei rekursiv ab und wertet einen Booleschen Ausdruck aus, der sich aus den im Abschnitt OPERANDS beschriebenen Primärdaten für jede gefundene Datei zusammensetzt. Jeder Pfadoperand wird unverändert wie angegeben ausgewertet, einschließlich aller nachfolgenden<slash>
Zeichen. Alle Pfadnamen für andere Dateien in der Hierarchie müssen aus der Verkettung des aktuellen Pfadoperanden, a,<slash>
wenn der aktuelle Pfadoperand nicht mit einem endete, und dem Dateinamen relativ zum Pfadoperanden bestehen. Der relative Teil darf keine Punkt- oder Punkt-Punkt-Komponenten enthalten, kein NachlaufenZeichen und nur einzelne<slash>
Zeichen zwischen Pfadnamen-Komponenten.
Sie können den Unterschied in der Übersicht für jeden sehen. GNU hat (wie üblich) optionale Elemente in eckigen Klammern:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...]
[expression]
POSIX gibt zwar nicht an, dass es optional sein kann:
find [-H|-L] path... [operand_expression...]
Im GNU-Programm geschieht dies in ftsfind.c
:
if (leer) { / * * Wir verwenden hier eine temporäre Variable, da einige Aktionen geändert werden * der Weg vorübergehend. Wenn wir also eine String-Konstante verwenden, * Wir bekommen einen Kernauswurf. Das beste Beispiel dafür ist, wenn wir sagen * "find -printf% H" (nicht "find. -printf% H"). * / char defaultpath [2] = "."; return find (Standardpfad); }
und der "."
Einfachheit halber wird ein Literal verwendet. So sehen Sie das gleiche Ergebnis mit
find
und
find .
da (und POSIX damit einverstanden ist) wird der angegebene Pfad verwendet, um die Ergebnisse voranzustellen (siehe oben für die Verkettung ).
Mit ein wenig Arbeit konnte man feststellen, wann das Feature zum ersten Mal hinzugefügt wurde; es war bei der ersten Erstellung von "findutils" im Jahr 1996 vorhanden (siehe find.c
):
+ /* If no paths are given, default to ".". */
+ for (i = 1; i < argc && strchr ("-!(),", argv[i][0]) == NULL; i++)
+ process_top_path (argv[i]);
+ if (i == 1)
+ process_top_path (".");
+
+ exit (exit_status);
+}
Aus dem Changelog für Find 3.8 ging dies anscheinend hervor
Sat Dec 15 19:01:12 1990 David J. MacKenzie (djm at egypt)
* find.c (main), util.c (usage): Make directory args optional,
defaulting to "."
Normalerweise werden die Dateien nachbearbeitet, und in diesem Fall kann es von großem Vorteil sein, den Dateinamen mit zu beginnen ./
. Beginnt ein Dateiname mit -
, könnte ein nachfolgender Befehl diesen Dateinamen als Option interpretieren. ./
vermeidet das.
Stellen Sie sich als Beispiel ein Verzeichnis mit den folgenden Dateien vor:
$ ls
--link --no-clobber
Stellen Sie sich nun vor, wie dieser Befehl funktionieren würde, wenn die Dateinamen ohne das vorangestellte Zeichen angegeben würden ./
:
$ find -type f -exec cp -t ../ {} +
Wir können das Problem an find
sich veranschaulichen . Lassen Sie es uns im selben Verzeichnis wie oben ausführen. Die folgenden Arbeiten:
$ find ./*
./--link
./--no-clobber
Folgendes schlägt fehl:
$ find *
find: unknown predicate `--link'
Try 'find --help' for more information.
find *
.file
fordern den Benutzer auf, einen Pfad anzugeben (wie die BSD-Suche unter OS X). Also muss man normalerweise explizit so etwas sagenfind . -type f ...
. Von da an ist es für einige Versionen von find (wie GNU find) kein großer Schritt, einfach die Standardeinstellung zu übernehmen.
und alles andere so zu belassen, wie es ist.find *
, dass das nicht angezeigt wird,.
ist, dass*
alle Dateien und Ordner aufgelistet, aber ausgeschlossen werden.
. Führen Sieecho *
in einem Verzeichnis, das nur eine oder zwei Dateien enthält, und Sie werden sehen, dass.
das nicht aufgeführt ist. Somitfind *
arbeitet jede Datei expandiert. Es ist das gleiche, als ob Siefind Desktop/
aus dem Home-Verzeichnis sagten . Sie sehen die Ausgabe alsDesktop/foo_bar.txt
find
verhalten, wie es ist. Verfügen Sie über maßgebliche Referenzinformationen, um die implizite Behauptung zu untermauern, diefind
so konzipiert wurde, dass sie sich aus diesem Grund soDer
find
Befehl benötigt Pfad (e) zum Suchen. Wenn wir keine angeben, wird das aktuelle Verzeichnis (.
) als Ausgangspunkt verwendet. Wenn Sie beispielsweise den Pfad übergeben,/tmp
wird dies als Ausgangspunkt betrachtet. Und damit die Ergebnisse.Wenn aktuelles Verzeichnis:
If-
/tmp
Verzeichnis:Wenn
abc
Verzeichnis unter dem aktuellen Verzeichnis:Wenn mehrere Verzeichnisse unter dem aktuellen Verzeichnis:
quelle
find
ein Pfad für die Suche benötigt wird und dass standardmäßig das aktuelle Verzeichnis verwendet wird. Die Frage ist, warum es das führende druckt,./
wennfile.txt
gerade das selbe wie ist./file.txt
.Wenn Sie keinen Pfad angeben,
find
übernimmt der Befehl${PWD}
den Pfad und druckt ihn auf seiner Ausgabe aus. Der Benutzer, der den Pfad nicht angibt, ändert nichts an der Funktionsweisefind
. Und find funktioniert standardmäßig immer mit Pfaden.quelle
/tmp
, dann$PWD
geht das/tmp
nicht./
./tmp
find /tmp
./
/tmp
. Es ist so, dass es nicht sein kann$PWD
.${PWD}
mich für die falsche Aussprachefind .
,find $PWD
undfind
(ohne Pfad, wenn Ihr Fund unterstützt).