回答:
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で必須ではない)ことに注意してください。ただし、findサポート-print0
、head
およびテキストユーティリティは通常NUL文字をサポートします。
関数を使用して、2つ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
、a \0
は改行文字を意味することに注意してください。だから、例えば、交換する\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 ...
-print0 | tr '\n\0' '\0\n'
持って行その中の改行文字がに変換されたファイルのパスを表すを\0
。したがって、最初の行をhead -n 1
使用して\0
sをtr '\0\n' '\n\0'
再度改行に変換すると、改行文字が埋め込まれたNUL区切りの最初のファイルパスが得られます。
\x0
代わりに使用する主な理由¹を無効にしません\n
か?(¹が含まれている可能性のある値に対処できるように\n
)