GNU head
i tail
od Coreutils w wersji 8.25 mają taką -z
opcję.
W starszych wersjach lub dla systemów innych niż GNU możesz spróbować zamienić \0
i \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Zauważ, że niektóre head
implementacje nie radzą sobie ze znakami NUL (i nie jest to wymagane przez POSIX), ale tam, gdzie find obsługuje -print0
, head
a narzędzia tekstowe ogólnie obsługują znaki NUL.
Możesz także użyć funkcji, aby zawinąć dowolne polecenie między dwoma tr
s:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Należy mieć na uwadze, że na mocy nul_terminated
, a \0
oznacza znak nowej linii. Tak na przykład, aby zastąpić \n
z _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
będący również rozszerzeniem GNU).
Jeśli chcesz uruchomić więcej niż jedno polecenie filtrowania , możesz:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Ale to oznacza uruchomienie kilku zbędnych tr
poleceń. Alternatywnie możesz uruchomić:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
zamiast\n
ograniczania wartości? (¹ więc\n
-print0 | tr '\n\0' '\0\n'
mają wiersze reprezentujące ścieżki do plików, w których konwertowane są znaki nowej linii\0
. Tak więc, jeśli weźmiesz pierwszy wierszhead -n 1
i ponownie przekonwertujesz\0
s z powrotem na nowe wierszetr '\0\n' '\n\0'
, masz pierwszą ścieżkę pliku rozdzieloną NUL z osadzonymi znakami nowego wiersza.