find
このコマンドは、ファイル名をnullで区切られた文字列(提供されている-print0
場合)として出力することができ、オプションがオンの状態で使用できますxargs
。-0
しかし、その間には、対応するファイルのコレクションを操作することは困難です。sort
コマンドには-z
ファイルを並べ替えるスイッチがありますが、head
含まれていませんtail
。
これらのnullで区切られた入力を便利な方法でどのようにhead
ANDできますか?tail
(いつでも短くて遅いRubyスクリプトを作成できますが、より良い方法があることを願っています)
ベストアンサー1
GNUhead
および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文字をサポートします。
tr
関数を使用して2つの間のコマンドをラップすることもできます。
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 ...