GNU head
e tail
dalla versione 8.25 di coreutils hanno -z
un'opzione per questo.
Con versioni precedenti o per sistemi non GNU, puoi provare a scambiare \0
e \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Si noti che alcune head
implementazioni non possono far fronte con caratteri NUL (e non sono tenuti a da POSIX), ma dove trovare appoggi -print0
, head
e le utility di testo in generale supportare i caratteri NUL.
Puoi anche usare una funzione per avvolgere qualsiasi comando tra i due tr
s:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Tieni presente che sotto nul_terminated
, \0
significa un personaggio newline. Ad esempio, per sostituire \n
con _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
essendo anche un'estensione GNU).
Se è necessario eseguire più di un comando di filtro , è possibile eseguire:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Ma questo significa eseguire alcuni tr
comandi ridondanti . In alternativa, puoi eseguire:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
anziché\n
per delimitare i valori? (¹ in modo da poter far fronte a valori che potrebbero contenere\n
)