Die Frage besteht aus zwei Teilen:
- wie geht
find es, Programme mit aufzurufen, -execohne auf Probleme mit Leerzeichen in Dateinamen zu stoßen, und
- was nützt das
-print0 Option?
Zum einen findhandelt 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 - findFunktion +wird wie folgt erläutert, in der Begründung :
Ein Merkmal des SVR4- findDienstprogramms war der -execTerminator + 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 -print0primä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 -print0Ausgabe 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 -print0primäre" bezieht sich auf GNU findund xargsdie das Problem auf eine andere Weise lösen. Es wird auch von FreeBSD findund unterstützt xargs. Wenn Sie dem Aufruf eine -0Option hinzugefügt haben (siehe Handbuchseite ), xargsakzeptiert dieses Programm Zeilen, die mit "Null-Byte" -Zeichen abgeschlossen sind. Im Gegenzug xargsruft exec -Funktionen zu tun , seine Arbeit. Der Hauptunterschied zwischen dem -print0und -0Merkmal 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 -tOption 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 -0Erweiterung von xargswü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 findakzeptiert.
find..exec