GNU head
và tail
kể từ coreutils phiên bản 8.25 có một -z
tùy chọn cho điều đó.
Với các phiên bản cũ hơn hoặc cho các hệ thống không phải GNU, bạn có thể thử và trao đổi \0
và \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Lưu ý rằng một số head
hiện thực không thể đối phó với các nhân vật NUL (và họ không phải bởi POSIX), nhưng nơi tìm sự ủng hộ -print0
, head
và các tiện ích văn bản nói chung hỗ trợ các ký NUL.
Bạn cũng có thể sử dụng một hàm để bọc bất kỳ lệnh nào giữa hai tr
s:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Hãy nhớ rằng dưới nul_terminated
, một \0
có nghĩa là một nhân vật dòng mới. Vì vậy, ví dụ, để thay thế \n
bằng _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
cũng là một phần mở rộng GNU).
Nếu bạn cần chạy nhiều hơn một lệnh lọc , bạn có thể làm:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Nhưng điều đó có nghĩa là chạy một vài tr
lệnh dư thừa . Ngoài ra, bạn có thể chạy:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
thay vì\n
phân định các giá trị? (Để bạn có thể đối phó với các giá trị có thể chứa\n
)