xargs
mengharapkan format input yang sangat istimewa di mana argumen dibatasi oleh kosong atau baris baru (kadang-kadang bentuk lain dari spasi putih, kadang-kadang tergantung pada lokal saat ini), dan di mana kutipan tunggal, tanda kutip ganda dan backslash dapat digunakan untuk menghindarinya (tetapi dengan cara yang berbeda jalan dari kutipan shell).
-l1
bukan untuk meneruskan satu baris input sebagai satu argumen tunggal mkdir
, tetapi untuk memanggil satu mkdir
permintaan untuk setiap baris input tetapi dengan kata-kata pada baris itu masih dipisahkan sebagai argumen yang berbeda mkdir
.
Implementasi GNU xargs
menambahkan -0
opsi beberapa dekade yang lalu untuk menerima input yang dibatasi oleh NUL. Itulah cara yang paling jelas untuk memisahkan kata-kata yang pada akhirnya akan menjadi argumen untuk suatu perintah karena karakter NUL adalah satu-satunya karakter yang tidak dapat muncul dalam argumen perintah atau nama file (format daftar pilihan Anda yang menempatkan satu file per baris tidak dapat mewakili semua nama file yang mungkin karena tidak mengizinkan baris baru dalam nama file).
Itu -0
telah disalin oleh beberapa xargs
implementasi lain tetapi tidak semua.
Dengan yang dapat Anda lakukan:
<file tr '\n' '\0' | xargs -0 mkdir -p --
Itu akan memanggil mkdir
sesering mungkin dengan argumen sebanyak mungkin.
Tetapi perhatikan bahwa jika file
kosong, mkdir
masih akan dijalankan dan Anda akan mendapatkan kesalahan sintaksis oleh mkdir
karena argumen yang hilang. GNU xargs
menambahkan -r
opsi untuk apa yang telah disalin oleh beberapa implementasi lainnya.
GNU xargs
juga menambahkan (nanti) -d
opsi untuk dapat menentukan pembatas yang sewenang-wenang, tapi saya rasa implementasi lainnya tidak menyalinnya. Dengan GNU xargs
, cara terbaik adalah dengan:
xargs -rd '\n' -a file mkdir -p --
Dengan meneruskan file dengan -a
(juga ekstensi GNU) alih-alih stdin, itu berarti mkdir
stdin dipertahankan.
POSIXly, Anda harus memposting-proses input untuk memasukkannya ke dalam format yang diharapkan oleh xargs
. Anda bisa melakukannya misalnya dengan:
<file sed 's/"/"\\""/g; s/^/"/; s/$/"/' | xargs mkdir -p --
Di mana kami menyertakan setiap baris di dalam tanda kutip ganda dan melarikan diri masing "
- masing seperti "\""
sebelum memberi makan ke xargs.
Namun waspadalah terhadap kemungkinan batasan:
- kesalahan saat file kosong sudah disebutkan di atas
- mungkin gagal dengan beberapa implementasi (termasuk dari
sed
) jika konten file
bukan teks yang valid di lokal saat ini. Jika file
berisi nama file yang dikodekan di lebih dari satu charset yang berbeda, atau charset yang berbeda dari yang lokal, Anda dapat memperbaiki lokal ke C yang seharusnya membantu.
- beberapa
xargs
implementasi memiliki batas yang sangat rendah pada panjang maksimum argumen (bisa serendah 255 byte).
Untuk mengatasi kesalahan sintaks saat kesalahan input kosong , Anda dapat menulis:
<file sed 's/"/"\\""/g; s/^/"/; s/$/"/' |
xargs sh -c '[ "$#" -eq 0 ] || exec mkdir -p -- "$@"' sh
-d
opsi.