Panduan Xargs untuk Pemula

Semua yang perlu kamu tahu tentang xargs

Xargs berfungsi untuk menjadikan standard input sebagai argumen pada perintah lain, jadi perintah yang awalnya tidak menerima standard input sebagai argumen seperti rm, kini menjadi bisa dengan bantuan xargs.

Dasar-Dasar Xargs#

Kita langsung ke contoh:

echo satu dua tiga | xargs touch

Maksud perintah di atas adalah xargs menerima standard input yang berisi “satu dua tiga” kemudian standard input tersebut dijadikan sebagai argumen untuk perintah touch.

Kalau perintah di atas dijalankan, hasil akhirnya jadi seperti ini:

touch satu dua tiga

Bisa kamu buktikan sendiri dengan mengaktifkan opsi verbose.

echo satu dua tiga | xargs -t touch

Mengatur Delimiter#

Ada kalanya kamu perlu mengatur delimiter, terutama kalau yang ingin dijadikan sebagai argumen adalah file yang namanya mengandung spasi.

Coba buatlah file yang namanya mengandung spasi.

touch "file.txt" "file 2.txt"

Kemudian hapus file tersebut dengan xargs dan rm tanpa mengatur delimeter.

ls *.txt | xargs rm

Bakal muncul error seperti ini:

rm: cannot remove 'file': No such file or directory
rm: cannot remove '2.txt': No such file or directory

Bawaan delimiter xargs adalah SPASI, oleh karena itu, pada kasus seperti di atas, perlu untuk mengatur delimiter agar spasinya tidak dianggap sebagai pemisah argumen.

Coba ulangi dari awal kemudian atur delimiter-nya menjadi \n.

ls *.txt | xargs -d "\n" rm

Seperti ini hasil akhir dari perintah di atas:

rm "file.txt" "file 2.txt"

Awalnya tadi seperti ini kalau delimiternya tidak diatur:

rm "file.txt" "file" "2.txt"

Membatasi Jumlah Argumen#

Bawaan xargs itu menjadikan seluruh isi argumen kepada perintah yang telah kita tentukan, dengan demikian hanya ada satu kali operasi.

Misalnya.

echo satu dua tiga | xargs touch

Hasilnya hanya ada satu kali operasi dan seluruh argumennya akan diterima oleh perintah touch:

touch satu dua tiga

Kamu bisa membatasi jumlah maksimal argumen untuk setiap perintah yang telah kita tentukan, fungsinya tak lain dan tak bukan supaya bisa menjalankan beberapa kali operasi dengan argumen yang berbeda-beda.

Misalnya, pada perintah di bawah ini, jumlah argumennya dibatasi menjadi satu:

echo URL1 URL2 URL3 | xargs -n 1 wget

Karena ada tiga argumen dan jumlah maksimal argumen yang harus diterima oleh perintah yang telah kita tentukan adalah satu, maka hasil akhirnya menjadi tiga operasi wget:

wget URL1
wget URL2
wget URL3

Contoh lain, kalau dibatasi menjadi maksimal dua argumen:

echo satu dua tiga empat | xargs -n 2 touch

Hasil akhirnya jadi dua operasi:

touch satu dua
touch tiga empat

Operasi Paralel#

Supaya bisa berjalan secara paralel, perlu untuk membatasi jumlah argumen dan mengatur jumlah maksimal process.

Contoh ini, process-nya dibatasi menjadi 4 process saja dan jumlah argumennya dibatasi menjadi satu:

echo URL1 URL2 URL3 URL4 | xargs -n 1 -P 4 wget

Hasil akhirnya, perintah-perintah di bawah ini berjalan secara paralel:

wget URL1
wget URL2
wget URL3
wget URL4

Supaya bisa unlimited alias semampunya komputermu, atur maksimal process-nya menjadi 0.

Mengatur Posisi Argumen#

Kalau tidak diatur, xargs meletakkan argumen di akhiran perintah yang telah kita tentukan, ada kalanya kamu mungkin perlu meletakkan argumen di awalan atau tengahan suatu perintah.

Kalau argumennya hanya ada satu, cukup seperti ini untuk mengatur posisi argumen:

echo file1 | xargs -I % rm %.txt

Seperti ini hasil akhir dari perintah di atas:

rm file1.txt

Kalau argumennya ada banyak, caranya berbeda dengan yang tadi. Coba buatlah file lagi.

touch satu dua tiga

Kita perlu mengatur posisi argumen supaya bisa menambahkan ekstensi .txt pada setiap file yang telah dibuat tadi:

ls * | xargs -d "\n" -I % -n 1 mv % %.txt

Seperti ini hasil akhir dari perintah di atas:

mv satu satu.txt
mv dua dua.txt
mv tiga tiga.txt

Kombo xargs dan bash -c#

Dengan kombo ini, kamu bisa melakukan dua hal yang tidak bisa dilakukan dengan opsi-opsi bawaan xargs.

Pertama, bisa mengatur posisi argumen yang lebih dari satu dengan variabel khusus untuk parameter ($0, $1, dst):

echo URL1 file1 URL2 file2 | xargs -n 2 bash -c 'curl -o $1 $0'

Seperti ini hasil akhir dari perintah di atas:

curl -o file1 URL1
curl -o file2 URL2

Kedua, bisa menjalankan lebih dari satu perintah, yang dipisahkan dengan titik koma (;) untuk setiap perintah.

touch satu.txt dua.txt
ls *.txt | xargs -I % -n 1 bash -c 'echo %; rm %'

Seperti hasil akhir dari perintah di atas:

echo satu.txt; rm satu.txt
echo dua.txt; rm dua.txt