GNU head
und tail
seit Coreutils Version 8.25 haben eine -z
Option dafür.
Bei älteren Versionen oder für Nicht-GNU - Systeme können Sie versuchen, Swap \0
und \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Beachten Sie, dass einige head
Implementierungen nicht mit NUL - Zeichen umgehen kann (und sie sind nicht erforderlich , um von POSIX), aber wo Träger finden -print0
, head
und Text - Dienstprogramme im Allgemeinen NUL - Zeichen unterstützen.
Sie können auch eine Funktion verwenden, um einen beliebigen Befehl zwischen den beiden tr
Werten zu setzen:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Denken Sie daran, dass unter nul_terminated
a \0
ein Newline-Zeichen steht. So zum Beispiel zu ersetzen \n
durch _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
ist auch eine GNU-Erweiterung).
Wenn Sie mehr als einen Filterbefehl ausführen müssen , haben Sie folgende Möglichkeiten:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Das heißt aber, ein paar redundante tr
Befehle auszuführen. Alternativ können Sie Folgendes ausführen:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
anstatt\n
die Werte abzugrenzen? (¹, damit Sie mit Werten umgehen können, die möglicherweise enthalten sind\n
)-print0 | tr '\n\0' '\0\n'
gibt es Zeilen, die die Dateipfade darstellen, in die Zeilenumbrüche konvertiert wurden\0
. Wenn Sie also die erste Zeile mit nehmenhead -n 1
und das\0
s wieder mit in Zeilenumbrüche umwandelntr '\0\n' '\n\0'
, erhalten Sie den ersten Dateipfad, der durch die eingebetteten Zeilenumbrüche NUL-getrennt ist.