Die Frage besteht aus zwei Teilen:
- wie geht
find
es, Programme mit aufzurufen, -exec
ohne auf Probleme mit Leerzeichen in Dateinamen zu stoßen, und
- was nützt das
-print0
Option?
Zum einen find
handelt es sich um einen Systemaufruf, der tatsächlich zu einer Gruppe verwandter Aufrufe gehört, die als "exec" bezeichnet werden . Es übergibt den Dateinamen als Argument direkt an diesen Aufruf, der dann direkt (nach dem Erstellen eines neuen Prozesses) übergeben wird, ohne Informationen über den Dateinamen zu verlieren.
Die POSIX - find
Funktion +
wird wie folgt erläutert, in der Begründung :
Ein Merkmal des SVR4- find
Dienstprogramms war der -exec
Terminator + des Primärs. Auf diese Weise konnten Dateinamen, die Sonderzeichen (insbesondere Zeilenvorschubzeichen ) enthielten, ohne die Probleme gruppiert werden, die bei der Weiterleitung solcher Dateinamen auftreten xargs
. Andere Implementierungen haben andere Möglichkeiten hinzugefügt, um dieses Problem zu umgehen, insbesondere eine -print0
primäre, die Dateinamen mit einem Null-Byte-Terminator schrieb. Dies wurde hier berücksichtigt, aber nicht übernommen. Die Verwendung eines Nullterminators bedeutete, dass jedes Dienstprogramm, das die -print0
Ausgabe von find verarbeiten sollte,
eine neue Option hinzufügen musste, um die Nullterminatoren zu analysieren, die es jetzt lesen würde.
Das "vor allem eine -print0
primäre" bezieht sich auf GNU find
und xargs
die das Problem auf eine andere Weise lösen. Es wird auch von FreeBSD find
und unterstützt xargs
. Wenn Sie dem Aufruf eine -0
Option hinzugefügt haben (siehe Handbuchseite ), xargs
akzeptiert dieses Programm Zeilen, die mit "Null-Byte" -Zeichen abgeschlossen sind. Im Gegenzug xargs
ruft exec -Funktionen zu tun , seine Arbeit. Der Hauptunterschied zwischen dem -print0
und -0
Merkmal gegenüber dem+
Feature besteht darin, dass das erstere die Dateinamen über eine Pipe übergibt, während das letztere dies nicht tut. Entwickler finden für fast alle Funktionen Verwendung. Die Rohre sind keine Ausnahme.
Zurück zum Beispiel von OP, das eine -t
Option verwendet, um cp
: das in POSIX cp nicht gefunden wird . Es handelt sich vielmehr um eine Erweiterung (auch bekannt als "Nicht-Standard-Feature"), die von GNU cp bereitgestellt wird . Die -0
Erweiterung von xargs
würde dieses Beispiel nicht verbessern, aber es gibt andere Fälle, in denen es effektiv genutzt werden kann - bedenken Sie, dass es die portable Alternative gibt +
, die GNU find
akzeptiert.
find..exec