Perintah xargs Linux: ubah masukan menjadi argumen perintah

Perintah xargs membaca item dari masukan standar dan menyusunnya menjadi argumen untuk perintah lain. Gunakan xargs ketika data dari pipa perlu menjadi daftar argumen, misalnya nama berkas untuk wc. Untuk nama berkas yang mungkin mengandung spasi atau baris baru, pasangkan find -print0 dengan xargs -0 agar batas setiap nama tetap utuh.

Secara bawaan, xargs memisahkan item berdasarkan spasi, tab, dan baris baru serta menafsirkan kutipan dan garis miring terbalik. Karena itu, keluaran teks yang tampak seperti satu nama belum tentu diterima sebagai satu argumen. Mode -0 memakai karakter NUL, yaitu bita bernilai nol, sebagai pemisah; kutipan dan garis miring terbalik pada item diperlakukan sebagai karakter biasa.

Sintaks dasar

PEMBUAT_DATA | xargs [OPSI]... KOMANDO [ARGUMEN_TETAP]...

PEMBUAT_DATA, KOMANDO, dan ARGUMEN_TETAP adalah penanda yang harus diganti sesuai pekerjaan. Xargs menambahkan item yang dibacanya setelah argumen tetap. Program dapat memanggil KOMANDO beberapa kali untuk menyesuaikan jumlah atau panjang argumen dengan batas sistem; satu masukan panjang tidak selalu menjadi satu pemanggilan.

Contoh berikut menggunakan GNU xargs dan GNU find. Periksa xargs --version, xargs --help, dan man xargs pada sistem Anda karena pilihan opsi serta perilaku bawaan dapat berbeda.

Buat nama berkas berspasi dan amati batas argumennya

Jalankan seluruh blok berikut di Bash atau shell yang mendukung sintaksnya. Blok membuat direktori latihan baru dengan mktemp dan menyiapkan semua berkas yang dipakai di dalamnya. Tanda kurung membatasi perubahan direktori pada subshell, sehingga direktori kerja terminal semula tidak berubah. Lokasi bahan latihan dicetak pada baris terakhir agar dapat diperiksa setelah blok selesai.

(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
mkdir reports
printf 'first\nsecond\n' > 'reports/two words.txt'
printf 'third\n' > 'reports/plain.txt'
printf '%s\0' 'reports/two words.txt' 'reports/plain.txt' |
    xargs -0 -r -n 1 printf 'ARG=[%s]\n'
find reports -type f -name '*.txt' -print0 | xargs -0 -r wc -l
printf 'two words\n' | xargs -n 1 printf 'SPLIT=[%s]\n'
printf 'Lab files: %s\n' "$labdir"
)

Periksa hasilnya dalam urutan berikut:

  1. Dua keluaran ARG adalah ARG=[reports/two words.txt] dan ARG=[reports/plain.txt]. Nama yang mempunyai spasi tetap satu argumen karena printf mengirim pemisah NUL dan xargs membacanya dengan -0.
  2. Wc -l menghitung dua baris pada two words.txt dan satu baris pada plain.txt, dengan total tiga. Urutan keluaran per berkas dapat mengikuti urutan penelusuran find; jangan mengharuskan satu nama selalu muncul lebih dahulu.
  3. Contoh terakhir menghasilkan SPLIT=[two] lalu SPLIT=[words]. Tanpa -0, satu baris teks two words dipecah menjadi dua item karena spasinya.

Perintah printf '%s\0' pada blok menghasilkan NUL setelah setiap argumen, bukan teks yang berisi karakter garis miring dan angka nol. Panduan printf dalam bahasa Inggris menjelaskan format keluaran. Find -print0 dan xargs -0 harus digunakan bersama; mengganti hanya satu sisi membuat format pengirim dan pembaca tidak sesuai.

Opsi -r pada contoh meminta GNU xargs tidak menjalankan perintah jika tidak ada item masukan. Tanpa -r, GNU xargs biasanya tetap menjalankan perintah sekali walaupun tidak ada masukan. Perbedaan ini penting ketika hasil pencarian kosong.

Atur jumlah argumen dan posisi pengganti

Batasi item untuk setiap pemanggilan

printf '%s\0' alpha beta gamma | xargs -0 -r -n 1 printf 'ITEM=[%s]\n' menghasilkan satu baris ITEM untuk alpha, beta, lalu gamma. Opsi -n 1 membatasi satu item masukan per pemanggilan printf. String format printf merupakan argumen tetap dan bukan satu dari item masukan yang dibatasi oleh -n.

Untuk mengirim beberapa item sekaligus, pilih nilai -n yang sesuai dengan perintah tujuan. Batas panjang perintah dari sistem masih berlaku, sehingga -n merupakan batas maksimum jumlah item, bukan jaminan bahwa setiap pemanggilan selalu mendapat jumlah yang sama.

Tempatkan item pada posisi tertentu

Untuk masukan teks sederhana yang satu itemnya berada pada satu baris, printf 'Ana\nBob\n' | xargs -I '{}' printf 'nama=%s\n' '{}' menghasilkan nama=Ana lalu nama=Bob. Penanda {} diganti dengan item masukan pada posisi argumen yang ditentukan.

Jangan menganggap -I membuat semua format nama berkas otomatis aman. Gunakan -0 untuk aliran nama berkas dengan pemisah NUL. Opsi -I, -n, dan -L juga mempunyai aturan interaksi di GNU xargs; hindari mencampurnya tanpa memahami aturan versi yang dipakai. Untuk mengatur ukuran kelompok, -n biasanya lebih langsung daripada menyisipkan placeholder pada setiap item.

Opsi yang penting

Opsi Kegunaan
-0 Pisahkan item dengan NUL dan perlakukan kutipan atau garis miring terbalik sebagai karakter biasa.
-r Pada contoh GNU xargs, jangan jalankan perintah jika tidak ada item.
-n N Berikan paling banyak N item masukan per pemanggilan perintah.
-P N Jalankan paling banyak N proses perintah secara bersamaan untuk nilai N positif.
-I PENANDA Ganti penanda pada argumen awal dengan item masukan.

Jika pencarian menghasilkan banyak nama, periksa terlebih dahulu dengan perintah yang hanya menampilkan batas argumen, seperti bagian ARG pada blok latihan. Setelah formatnya benar, pilih perintah tujuan yang sesuai. Jangan langsung mengganti contoh printf dengan operasi yang mengubah atau menghapus data tanpa meninjau nama dan cakupan pencariannya.

Hal yang perlu diperhatikan

Pipa membawa data, xargs membentuk argumen

Pada pola KOMANDO1 | KOMANDO2, keluaran KOMANDO1 masuk ke masukan standar KOMANDO2. Pada pola dengan xargs, item dibaca untuk membentuk daftar argumen KOMANDO2. Perbedaan ini menentukan apakah program tujuan membaca isi data dari stdin atau membuka nama berkas yang diberikan sebagai argumen.

Dalam mode GNU xargs yang membaca item dari stdin, masukan standar proses yang dijalankannya biasanya dialihkan dari /dev/null. Jangan menganggap program tujuan sekaligus mendapat aliran item sebagai isi stdin. Opsi dan kebutuhan program interaktif perlu dipilih secara khusus.

NUL menjaga batas nama, tetapi bukan semua aspek pemrosesan

Mode -0 mencegah spasi atau baris baru pada nama dipecah menjadi beberapa argumen. Program tujuan tetap dapat menafsirkan argumen yang diawali tanda minus sebagai opsi. Bila program tujuan mendukungnya, letakkan -- pada posisi yang tepat untuk mengakhiri daftar opsinya, misalnya find reports -type f -name '*.txt' -print0 | xargs -0 -r wc -l --. Pada contoh, -- diberikan kepada wc, bukan sebagai opsi xargs.

Nama di blok latihan selalu berawalan reports/, dan operasinya hanya membaca untuk menghitung baris. Untuk operasi yang mengubah data, pastikan direktori serta daftar sasaran memang sesuai. Pemisahan NUL tidak menjamin bahwa berkas tidak berubah antara saat ditemukan dan saat perintah tujuan membukanya.

Proses paralel dapat mengubah urutan keluaran

-P N membatasi jumlah proses serentak ketika N positif. Biasanya opsi ini dipadukan dengan -n atau pengaturan kelompok lain agar pekerjaan terbagi ke beberapa pemanggilan. Jika seluruh item masuk dalam satu pemanggilan, penambahan -P tidak dengan sendirinya membagi pekerjaan di dalam perintah tujuan.

Ketika beberapa proses menulis ke terminal atau berkas yang sama, urutan dan penggabungan keluarannya dapat berubah. Gunakan sumber daya terpisah atau pengaturan sinkronisasi jika hasil harus tersusun secara tertentu. Mulailah dengan pemrosesan berurutan sampai perilaku dan beban perintah tujuan jelas.

Periksa hasil dan status perintah

Periksa pesan kesalahan dan status akhir xargs, bukan hanya apakah ada keluaran yang terlihat. Xargs merangkum status pemanggilan perintah dan tidak selalu meneruskan kode keluar perintah tujuan tanpa perubahan. Blok latihan menyimpan bahan di direktori yang dicetak setelah teks Lab files:; periksa bahan tersebut dan bersihkan hanya lokasi latihan yang sudah Anda pastikan.

FAQ

Apa perbedaan memakai pipa biasa dan xargs?

Pipa biasa meneruskan data ke masukan standar program berikutnya. Xargs membaca item lalu menambahkannya sebagai argumen saat menjalankan program tujuan. Untuk nama berkas, pilih format pemisah yang menjaga batas setiap nama, biasanya pasangan -print0 dan -0.

Dokumentasi

Opsi, batas argumen, status keluar, dan perbedaan implementasi dibahas dalam manual GNU xargs yang ditayangkan di man7.