Betrachten Sie einige gängige * nix-Systeme (z. B. Debian, CentOS, Arch und Kali).
Ich immer verwendet find
; Ich kann mich nicht erinnern, GNU find verwendet zu haben, aber aus einem Beispiel habe ich gesehen, dass ich angenommen habe, dass die Syntax von GNU find einfacher ist (obwohl kann weniger Operationen zulassen).
Ich habe zwei Fragen:
-
Ist
find
das Standarddienstprogramm „Suchen oder Bedienen“ in gängigen Systemen oder werden Systeme mit beidenfind
undGNU find
? -
War
GNU find
beabsichtigte, einfacher zu machen alsfind
?
Kommentare
- Sie haben immer GNU find unter Linux verwendet, es sei denn, Sie ' ist ein großer Benutzer von
find
auf Busybox oder Android 😉 Auf Nicht-Linux-Systemen wird GNU find normalerweisegfind
. - Versuchen Sie
find --version
😉 - Die Systeme, auf die Sie sich ' beziehen, sind GNU-Systeme, GNU / Linux für die meisten, obwohl Debian für einige andere Kernel verfügbar ist Gut. Daher ist es ' nicht überraschend, dass die
find
-Implementierung auf diesen Systemen GNUfind
ist.
Antwort
GNU-Dienstprogramme implementieren häufig den POSIX-Standard und erweitern ihn für zusätzlichen Komfort um zusätzliche Funktionen (und als Kehrseite davon verringerte Portabilität über Unices). Der Portabilitätsaspekt ist, warum Sie auf dieser Site manchmal Antworten oder Kommentare sehen, die sehr sorgfältig darauf hinweisen, wann ein GNU-Dienstprogramm oder eine andere spezifische Implementierung eines Dienstprogramms angenommen wird.
Wenn Sie unter Linux arbeiten System würden Sie sehr wahrscheinlich die GNU-Implementierung von find
verwenden, und Sie würden wahrscheinlich kein anderes find
installiert. Auf Nicht-Linux-Systemen hätten Sie eine native find
und die Möglichkeit, auch GNU find
zu installieren (die am häufigsten unter der installiert wird Name gfind
oder seltener gnufind
).
Wie bei den meisten GNU-Dienstprogrammen GNU find
implementiert und erweitert die Standardspezifikation find
. Es ist daher nicht „einfacher“, sondern wohl komplexer, um bequemer zu sein, und es wäre etwas einfacher, bestimmte komplexe Aufgaben damit zu erledigen, als mit einem streng standardkonformen find
Erweiterte Implementierungen von find
implementieren beispielsweise häufig die -maxdepth
und Prädikate, die der Standard nicht erwähnt, und insbesondere GNU find
verfügt auch über -printf
, um die gefundenen Pfadnamen mit auszudrucken Eine Vielzahl von Formatierungsmöglichkeiten (der Standard find
verfügt nicht über -printf
) und Prädikate für die Durchführung von Übereinstimmungen mit regulären Ausdrücken verschiedener Art für Pfadnamen. sowie eine Reihe anderer nicht standardmäßiger Prädikate, von denen einige auch in anderen Implementierungen von find
zu finden sind (möglicherweise mit einer etwas anderen Semantik wie whi ch funktioniert etwas anders, je nachdem, was find
verwendet wird 1 ).
Die -delete
, das in der Antwort verwendet wird, auf die Sie verlinken, ist kein Standard, wird jedoch von GNU find
sowie in find
auf einigen anderen Nicht-Linux-Systemen. GNU find
„s -delete
beschwert sich, wenn Sie damit ein nicht leeres Verzeichnis löschen, aber die entsprechende Option mit z. B. OpenBSD“ s find
wird dies nicht tun (und das nicht leere Verzeichnis wird auch nicht gelöscht).
Die meisten Linux-Systeme verwenden unabhängig von der Verteilung dieselben Coreutils und Findutils-Tools (Varianten wie Busybox existiert offensichtlich). Um einen völlig anderen Satz von Tool-Implementierungen zu verwenden, müssten Sie zu einem der Open-Source-BSD-Systeme oder zu macOS, Solaris, AIX oder einem anderen kommerziellen Unix wechseln.
1 GNU find
stellt ./
Pfadnamen voran, wenn -execdir
verwendet wird Einige andere Implementierungen tun dies nicht.
Kommentare
- Und
-print0
und-direxec
und-delete
und … ;-). Die in GNU-Tools verfügbaren Nulltrennoptionen sind besonders praktisch. - @StephenKitt Aber selten benötigt 🙂
- richtig, außer wenn hier Nicht-POSIX-Antworten geschrieben werden ;-). (Oder Skripte, die überall funktionieren müssen.)
- Das Hauptproblem bei der GNU-Dokumentation besteht darin, dass versucht wird, nicht standardmäßige Aliase für POSIX-Methoden zu verwenden und somit die Verwandte Skripte zum Erstellen einer Anbietersperre.
- @StephenKitt
-print0
ist auch für * bsd und solaris verfügbar. Aber unter Solarisxargs -0
funktioniert ' nicht, alsogxargs -0
(von/usr/bin/sfw
) sollte stattdessen verwendet werden.
Antwort
Worauf sich die Leute oft beziehen als Linux wird besser als GNU / Linux bezeichnet: Linux plus GNU. Daher sind die von Ihnen verwendeten Tools wahrscheinlich GNU.
- Linux: Ein Kernel, der in GNU / Linux, Android und vielen anderen Systemen verwendet wird.
- GNU: an Betriebssystem, das häufig mit dem Linux-Kernel verwendet wird, aber auch mit BSD, Hurd, Cygwin (eine DLL für Microsoft Windows, es gibt vor, ein Kernel zu sein), WSL (Windows-Subsystem für Linux: GNU ohne Linux) verwendet werden kann Microsoft Windows), HPUX, Solaris, Dec Athena und viele andere.
Daher verwenden Sie wahrscheinlich GNU find.
GNU ist ein Projekt, das neu erstellt werden muss Schreiben Sie eine kostenlose (kostenlos wie in Freiheit, nicht wie im Preis) Version von Unix, einschließlich Tools wie find
, das GNU-Projekt kümmert sich nicht um die POSIX-Konformität: Es wird konform sein, wo es sinnvoll ist, aber auch Verbesserungen vornehmen.
Sie gehen auch davon aus, dass es nur eine andere gibt find
ist falsch.