GNU head
ve tail
coreutils sürüm 8.25'ten beri -z
bunun için bir seçenek var.
Eski sürümleri ile veya GNU dışı sistemler için, denemek ve takas edebilir \0
ve \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
Bazı geldiğini hatırlatırız head
uygulamaları boş karakterlerden ile baş edemez (ve POSIX tarafından çıkarmanız gerektiğini), ama nereye destekleri bulmak -print0
, head
ve metin araçları ile genellikle boş karakteri destekler.
İki tr
s arasındaki herhangi bir komutu sarmak için bir işlev de kullanabilirsiniz :
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
Onun altında Unutmayın nul_terminated
bir, \0
aracı bir satır karakteri. Yani örneğin, yerine \n
ile _
:
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
aynı zamanda bir GNU uzantısıdır).
Birden fazla filtreleme komutu çalıştırmanız gerekiyorsa şunları yapabilirsiniz:
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
Ancak bu, birkaç gereksiz tr
komut çalıştırmak demektir . Alternatif olarak, şunları da çalıştırabilirsiniz:
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
\x0
yerine kullanımın birincil nedenini bozmaz\n
mı? (¹ içerebilecek değerlerle başa çıkabilirsiniz\n
)