GNU head
y tail
desde coreutils versión 8.25 tienen una -z
opción para eso.
Con versiones anteriores o para sistemas que no son GNU, puede intentar intercambiar \0
y \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Tenga en cuenta que algunas head
implementaciones no pueden hacer frente con caracteres NUL (y que no se les exige que por POSIX), pero donde encontrar apoyos -print0
, head
y utilidades de texto en general, apoyar caracteres NUL.
También puede usar una función para ajustar cualquier comando entre los dos tr
s:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Tenga en cuenta que debajo nul_terminated
, a \0
significa un personaje de nueva línea. Entonces, por ejemplo, para reemplazar \n
con _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
siendo también una extensión GNU).
Si necesita ejecutar más de un comando de filtrado , puede hacer lo siguiente:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Pero eso significa ejecutar algunos tr
comandos redundantes . Alternativamente, puede ejecutar:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
lugar de\n
delimitar los valores? (¹ para que pueda hacer frente a los valores que pueden contener\n
)