GNU head
dan tail
karena coreutils versi 8.25 memiliki -z
opsi untuk itu.
Dengan versi yang lebih lama atau untuk sistem non-GNU, Anda dapat mencoba dan bertukar \0
dan \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Perhatikan bahwa beberapa head
implementasi tidak dapat mengatasi karakter NUL (dan mereka tidak diharuskan oleh POSIX), tetapi di mana menemukan dukungan -print0
, head
dan utilitas teks umumnya mendukung karakter NUL.
Anda juga dapat menggunakan fungsi untuk membungkus perintah apa pun di antara keduanya tr
:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Perlu diingat bahwa di bawah nul_terminated
, \0
berarti karakter baris baru. Jadi misalnya, untuk mengganti \n
dengan _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
menjadi juga ekstensi GNU).
Jika Anda perlu menjalankan lebih dari satu perintah pemfilteran , Anda dapat melakukan:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Tetapi itu berarti menjalankan beberapa tr
perintah yang berlebihan . Atau, Anda dapat menjalankan:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
alih-alih\n
membatasi nilai? (¹ sehingga Anda dapat mengatasi nilai-nilai yang mungkin mengandung\n
)-print0 | tr '\n\0' '\0\n'
memiliki garis-garis yang mewakili jalur file tempat karakter baris baru di dalamnya telah dikonversi\0
. Jadi, jika Anda mengambil baris pertama denganhead -n 1
dan mengonversi\0
kembali ke baris baru dengantr '\0\n' '\n\0'
lagi, Anda punya jalur file pertama NUL-dibatasi dengan karakter baris baru yang tertanam.