xargs
は、引数が空白または改行で区切られる非常に特殊な入力形式(他の形式の垂直空白、現在のロケールに依存する場合がある)、および一重引用符、二重引用符、バックスラッシュを使用してそれらをエスケープできる(ただし、別の形式)シェル引用からの道)。
-l1
は、1行の入力を1つの単一の引数としてに渡すのではなく、1行の入力ごとにmkdir
1回のmkdir
呼び出しを呼び出しますが、その行の単語は依然としてに異なる引数として分離されますmkdir
。
のGNU実装にはxargs
、-0
NULで区切られた入力を受け入れるオプションが数十年前に追加されました。NUL文字はコマンドの引数またはファイル名(1行に1つのファイルを置く選択したリスト形式)に出現できない唯一の文字であるため、コマンドの引数となる単語を分離する最も明白な方法です。ファイル名に改行を使用できないため、すべての可能なファイル名を表すことはできません)。
これ-0
は他のいくつかのxargs
実装によってコピーされましたが、すべてではありません。
あなたができるもので:
<file tr '\n' '\0' | xargs -0 mkdir -p --
これはmkdir
、できるだけ多くの引数を使用して、可能な限り数回呼び出します。
ただし、file
が空の場合mkdir
でも実行されmkdir
、引数がないために構文エラーが発生することに注意してください。GNU xargs
は、-r
他のいくつかの実装によってコピーされたオプションを追加しました。
GNUはxargs
また、(後で)-d
任意の区切り文字を指定できるオプションを追加しましたが、他の実装がそれをコピーしたとは思いません。GNUのxargs
場合、最善の方法は次のとおりです。
xargs -rd '\n' -a file mkdir -p --
-a
stdinの代わりに(これもGNU拡張機能で)ファイルを渡すと、mkdir
のstdinが保持されます。
POSIXlyでは、入力を後処理して、が期待する形式にする必要がありますxargs
。あなたはそれを例えば次のようにして行うことができます:
<file sed 's/"/"\\""/g; s/^/"/; s/$/"/' | xargs mkdir -p --
各行を二重引用符で囲み、xargsにフィードする前と"
同じよう"\""
にエスケープします。
ただし、考えられる制限に注意してください。
- 上記のファイルが空の場合のエラー
sed
のコンテンツがfile
現在のロケールで有効なテキストでない場合、一部の実装(を含む)で失敗する可能性があります。file
複数の異なる文字セット、またはロケールの文字セットとは異なる文字セットでエンコードされたファイル名が含まれている場合は、ロケールをCに修正すると便利です。
- 一部の
xargs
実装では、引数の最大長に途方もなく低い制限があります(255バイトまで低くすることができます)。
空の入力エラーで構文エラーを回避するには、次のように記述します。
<file sed 's/"/"\\""/g; s/^/"/; s/$/"/' |
xargs sh -c '[ "$#" -eq 0 ] || exec mkdir -p -- "$@"' sh
-d
オプションにはGNU xargsが必要です。