Unix-ähnliche Systeme erlauben die Darstellung beliebiger Zeichen in Dateinamen mit Ausnahme des ASCII NUL-Zeichens und des Schrägstrichs. Schrägstriche können in Pfadnamen auftreten (als Verzeichnistrennzeichen), aber nicht in den Namen tatsächlicher Verzeichniseinträge. Dies bedeutet, dass die Liste der Dateien, die xargs
liest, Leerzeichen enthalten könnte - Leerzeichen, Tabulatoren und Zeilenumbrüche. Da xargs
standardmäßig davon ausgeht, dass die Liste der zu lesenden Dateien Leerraum als Argumenttrennzeichen verwendet, kann der Fall, in dem ein Dateiname tatsächlich Leerraum enthält, nicht korrekt verarbeitet werden. Dies macht das Standardverhalten von xargs
fast nutzlos für die Verarbeitung beliebiger Daten.
Um dieses Problem zu lösen, führte GNU findutils die Aktion '-print0' zum Suchen ein. Dies verwendet das Zeichen ASCII NUL, um die Einträge in der Dateiliste zu trennen, die es erzeugt. Dies ist die ideale Wahl für Trennzeichen, da es das einzige Zeichen ist, das nicht innerhalb eines Pfadnamens erscheinen kann. Die '0' -Option zu xargs
lässt annehmen, dass Argumente mit ASCII NUL anstelle von Leerraum getrennt sind. Es deaktiviert auch ein anderes Fehlmerkmal in dem Standardverhalten von xargs
, das ist, dass es auf Anführungszeichen in seiner Eingabe achtet. Einige Versionen von xargs
enden auch, wenn sie ein einzelnes '_' in der Eingabe sehen, aber GNU findet das nicht mehr (da es ein optionales Verhalten im Unix-Standard geworden ist).
So setzen, -print0 zusammen mit xargs finden -0 bekommen wir diesen Befehl ein:
find /var/tmp/stuff -mtime +90 -print0 | xargs -0 /bin/rm
Das Ergebnis ist eine effiziente Vorgehensweise, die korrekt die alle möglichen Zeichen behandelt, die in der Liste der Dateien angezeigt werden könnten löschen. Das sind gute Neuigkeiten. Allerdings gibt es, wie Sie sicherlich erwarten, auch schlechtere Nachrichten. Das Problem ist, dass dies kein tragbares Konstrukt ist; obwohl andere Versionen von Unix (insbesondere BSD-abgeleitete) "-print0" unterstützen, ist es nicht universell.
'find ... -print0' und' xargs -0' sind Nicht-Standard-GNU-Erweiterungen. Sie erwähnen GNU-Dienstprogramme, machen aber nicht klar, dass Nicht-GNU-Implementierungen wahrscheinlich nicht über diese Erweiterungen verfügen. –