GNU head
และtail
coreutils ตั้งแต่ 8.25 มี-z
ตัวเลือกสำหรับสิ่งนั้น
ด้วยรุ่นที่เก่ากว่าหรือสำหรับระบบที่ไม่ใช่ GNU คุณสามารถลองและสลับ\0
และ\n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
ทราบว่าบางhead
การใช้งานที่ไม่สามารถรับมือกับตัวละคร NUL (และพวกเขากำลังไม่จำเป็นต้องโดย POSIX) แต่ที่พบการสนับสนุน-print0
, head
และระบบสาธารณูปโภคข้อความทั่วไปสนับสนุนตัวละคร NUL
คุณสามารถใช้ฟังก์ชั่นเพื่อตัดคำสั่งใด ๆ ระหว่างสองtr
s:
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
เก็บไว้ในใจว่าภายใต้nul_terminated
การ\0
หมายถึงอักขระ newline ตัวอย่างเช่นหากต้องการแทนที่\n
ด้วย_
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
เป็นส่วนขยาย GNU ด้วย)
หากคุณต้องการเรียกใช้คำสั่งการกรองมากกว่าหนึ่งคำสั่งคุณสามารถทำได้:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
แต่นั่นหมายถึงการรันtr
คำสั่งซ้ำซ้อนสองสามคำ หรือคุณสามารถเรียกใช้:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
แทน\n
การกำหนดค่าหรือไม่ (¹เพื่อให้คุณสามารถรับมือกับค่าที่อาจมี\n
)