GNU headvà tailkể từ coreutils phiên bản 8.25 có một -ztù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 \0và \n:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Lưu ý rằng một số headhiệ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, headvà 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 trs:
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 \0có nghĩa là một nhân vật dòng mới. Vì vậy, ví dụ, để thay thế \nbằng _:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0cũ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 trlệnh dư thừa . Ngoài ra, bạn có thể chạy:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0thay vì\nphân định các giá trị? (Để bạn có thể đối phó với các giá trị có thể chứa\n)