GNU head
et tail
depuis coreutils version 8.25 ont une -z
option pour cela.
Avec des versions plus anciennes ou pour des systèmes non GNU, vous pouvez essayer de permuter \0
et \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Notez que certaines head
implémentations ne peuvent pas faire face à des caractères NUL (et ils ne sont pas requis par POSIX), mais où trouver des appuis -print0
, head
et les services publics de texte prennent en charge généralement des caractères NUL.
Vous pouvez également utiliser une fonction pour encapsuler n'importe quelle commande entre les deux tr
s:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Gardez à l'esprit que sous nul_terminated
, un \0
signifie un caractère de nouvelle ligne. Ainsi, par exemple, pour remplacer \n
par _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
étant également une extension GNU).
Si vous devez exécuter plusieurs commandes de filtrage , vous pouvez effectuer:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Mais cela signifie exécuter quelques tr
commandes redondantes . Vous pouvez également exécuter:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
plutôt que de\n
délimiter les valeurs? (¹ afin que vous puissiez faire face aux valeurs qui pourraient contenir\n
)-print0 | tr '\n\0' '\0\n'
a des lignes représentant les chemins de fichier dans lesquels les caractères de nouvelle ligne ont été convertis\0
. Donc, si vous prenez la première ligne avechead -n 1
et reconvertissez le\0
s en retour à la ligne avectr '\0\n' '\n\0'
, vous avez le premier chemin de fichier délimité NUL avec ses caractères de nouvelle ligne incorporés.