bashでnullで区切られた入力で「頭」と「尾」を実行する方法は?

bashでnullで区切られた入力で「頭」と「尾」を実行する方法は?

findこのコマンドは、ファイル名をnullで区切られた文字列(提供されている-print0場合)として出力することができ、オプションがオンの状態で使用できますxargs-0しかし、その間には、対応するファイルのコレクションを操作することは困難です。sortコマンドには-zファイルを並べ替えるスイッチがありますが、head含まれていませんtail

これらのnullで区切られた入力を便利な方法でどのようにheadANDできますか?tail(いつでも短くて遅いRubyスクリプトを作成できますが、より良い方法があることを願っています)

ベストアンサー1

GNUheadおよびtailcoreutilsバージョン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_terminatedaは\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 ...

おすすめ記事