O GNU head
e a tail
versão 8.25 do coreutils têm uma -z
opção para isso.
Com versões mais antigas ou para sistemas não-GNU, você pode tentar trocar \0
e \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Observe que algumas head
implementações não conseguem lidar com caracteres NUL (e não são exigidos pelo POSIX), mas onde encontrar suporte -print0
, head
e utilitários de texto geralmente suportam caracteres NUL.
Você também pode usar uma função para quebrar qualquer comando entre os dois tr
s:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Lembre-se de que nul_terminated
, abaixo , a \0
significa um caractere de nova linha. Por exemplo, para substituir \n
por _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
sendo também uma extensão GNU).
Se você precisar executar mais de um comando de filtragem , poderá:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Mas isso significa executar alguns tr
comandos redundantes . Como alternativa, você pode executar:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
vez de\n
delimitar os valores? (¹ para que você pode lidar com valores que pode conter\n
)-print0 | tr '\n\0' '\0\n'
tem linhas que representam os caminhos de arquivo em que caracteres de nova linha neles foram convertidos para\0
. Portanto, se você pegar a primeira linhahead -n 1
e converter\0
s novamente em novas linhastr '\0\n' '\n\0'
, terá o primeiro caminho de arquivo delimitado por NUL com seus caracteres de nova linha incorporados.