Saya punya file
yang berisi daftar nama. yaitu:
Long Name One (001)
Long Name Two (201)
Long Name Three (123)
...
dengan spasi dan beberapa karakter khusus. Saya ingin membuat direktori dari nama-nama ini, yaitu:
cat file | xargs -l1 mkdir
Itu membuat direktori individu dipisahkan oleh spasi, yaitu Long
, Name
, One
, Two
, Three
, bukan Long Name One (001)
, Long Name Two (201)
, Long Name Three (123)
.
Bagaimana saya bisa melakukan itu?
shell
xargs
whitespace
Majal
sumber
sumber
-d
opsi.Jika
-0
opsi dukungan implementasi xargs Anda :POSIXly:
(Perhatikan bahwa menggunakan
while
loop untuk memproses teks dianggap praktik buruk dalam skrip shell)sumber
mkdir
per direktori,mkdir
dapat mengambil lebih dari satu argumen.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 tunggalmkdir
, tetapi untuk memanggil satumkdir
permintaan untuk setiap baris input tetapi dengan kata-kata pada baris itu masih dipisahkan sebagai argumen yang berbedamkdir
.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 beberapaxargs
implementasi lain tetapi tidak semua.Dengan yang dapat Anda lakukan:
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 olehmkdir
karena argumen yang hilang. GNUxargs
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 GNUxargs
, cara terbaik adalah dengan:Dengan meneruskan file dengan
-a
(juga ekstensi GNU) alih-alih stdin, itu berartimkdir
stdin dipertahankan.POSIXly, Anda harus memposting-proses input untuk memasukkannya ke dalam format yang diharapkan oleh
xargs
. Anda bisa melakukannya misalnya dengan: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:
sed
) jika kontenfile
bukan teks yang valid di lokal saat ini. Jikafile
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.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:
sumber
Buat nama-nama tersebut nol diakhiri dan pisah di sana:
tr
akan mengganti baris baru yangcat
dihasilkan dengan\0
, dan-0
bendera dixargs
mengatakan untuk memecah argumen pada\0
.sumber
Anda dapat melakukan ini dengan POSIXLY dengan
-I
opsi:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
sumber