xargs adalah salah satu perintah yang paling kuat di Linux. Dalam tutorial ini, saya akan menunjukkan kepada Anda bagaimana Anda dapat xargs untuk mengubah input standar menjadi perintah.
Apa itu perintah xargs?
Perintah xargs membaca baris teks dari input standar atau dari output perintah lain dan mengubahnya menjadi perintah dan menjalankannya.
Anda akan sering menemukan perintah xargs digunakan dengan perintah find. Perintah find memberi Anda daftar nama file dan perintah xargs memungkinkan Anda menggunakan nama file tersebut, satu per satu, seolah-olah itu dimasukkan ke perintah lain.
Karena xargs berfungsi pada pengalihan, saya sangat menyarankan untuk meningkatkan pengetahuan Anda tentang pengalihan stdin, stdout, dan pipa di Linux.
Bagaimana cara menggunakan perintah xargs?
Perintah xargs memiliki sintaks berikut:
xargs [options] [command [initial-arguments]]
Tapi Anda mungkin tidak akan menggunakannya seperti itu. Kekuatannya terletak pada menggabungkan output dari satu perintah ke perintah lainnya. Mari kita lihat dengan contoh sederhana.
Di direktori saya saat ini, saya memiliki beberapa file teks dan flowers.txt memiliki nama semua file ini:
[email protected]:~/tutorial$ ls
flowers.txt lily.txt one_lotus.txt rose.txt three_lotus.txt two_lotus.txt
[email protected]:~/tutorial$ cat flowers.txt
lily.txt
one_lotus.txt
rose.txt
three_lotus.txt
two_lotus.txt
Sekarang tujuan saya adalah saya ingin melihat ukuran file dari semua file yang disebutkan di flowers.txt. Akal sehat mengatakan bahwa saya dapat menggabungkan perintah cat untuk menampilkan semua nama file dan kemudian menyalurkannya ke perintah du untuk memeriksa ukuran file.
Tetapi jika saya menyalurkannya secara langsung, itu tidak akan memberikan ukuran setiap file yang disebutkan dalam file flowers.txt.
[email protected]:~/tutorial$ du -h
52K .
[email protected]:~/tutorial$ cat flowers.txt | du -h
52K .
Mengapa? Pertama, perintah du tidak mengambil input standar. Kedua, output dari perintah cat bukanlah nama file individual. Ini seperti sebuah kata yang dipisahkan oleh karakter baris baru.
Keajaiban perintah xargs adalah ia akan mengambil ini dan teks dipisahkan oleh baris kosong atau baru dan mengubahnya menjadi input individual ke perintah berikutnya.
[email protected]:~/tutorial$ cat flowers.txt | xargs du -h
4.0K lily.txt
4.0K one_lotus.txt
16K rose.txt
4.0K three_lotus.txt
16K two_lotus.txt
Anggap saja sama dengan memasukkan nama file tersebut ke perintah du:
[email protected]:~/tutorial$ du -h lily.txt one_lotus.txt rose.txt three_lotus.txt two_lotus.txt
4.0K lily.txt
4.0K one_lotus.txt
16K rose.txt
4.0K three_lotus.txt
16K two_lotus.txt
Anda menyadari kekuatan perintah xargs sekarang, bukan?
xargs dan temukan:dibuat untuk satu sama lain
Anda akan sering menemukannya digunakan dalam kombinasi dari "find command". Perintah find mencari file dan direktori dan mengembalikan namanya. Berkat xargs, Anda dapat menggunakan hasil dari perintah find untuk tujuan tertentu seperti mengganti nama, memindahkan, menghapus, dan yang tidak.
Katakanlah, Anda ingin mendapatkan semua file yang berakhiran .txt dan berisi kata merah. Anda dapat menggabungkan perintah find dan grep dengan bantuan xargs:
[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./three_lotus.txt
./two_lotus.txt
./rose.txt
Berurusan dengan nama file dengan spasi
Jika Anda memiliki file dengan spasi di namanya, itu akan menyebabkan masalah. Katakanlah saya mengganti nama three_lotus.txt menjadi “three lotus.txt”. Sekarang ketika diproses melalui xargs, itu terlihat sebagai dua file terpisah sebagai tiga dan lotus.txt.
[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./two_lotus.txt
grep: ./three: No such file or directory
grep: lotus.txt: No such file or directory
./rose.txt
Dalam kasus seperti itu, Anda harus menggunakan opsi -print0 dari perintah find. Ini memisahkan baris dengan karakter nol ASCII alih-alih karakter baris baru. Demikian pula, Anda juga harus menggunakan xargs dengan -0 untuk menerima null ASCII.
[email protected]:~/tutorial$ find . -type f -print0 -name "*.txt" | xargs -0 grep -l red
./two_lotus.txt
./three lotus.txt
./rose.txt
Melihat perintah apa yang sedang dieksekusi
Jika Anda ingin melihat perintah apa yang sedang dieksekusi dengan bantuan xargs, Anda dapat menggunakan opsi -t. Ini akan mencetak perintah yang sebenarnya sedang dieksekusi.
[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -t touch
touch ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt
Paksa xargs untuk meminta konfirmasi sebelum menjalankan perintah
Beberapa situasi menuntut untuk ekstra hati-hati seperti menghapus file. Sebaiknya lihat perintah apa yang akan dijalankan dan memiliki opsi untuk menolak eksekusi.
Anda dapat menggunakan opsi -p dari xargs untuk mendapatkan prompt.
[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p rm
rm ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...n
Menggunakan placeholder dengan xargs untuk mendapatkan kontrol yang lebih besar
Secara default, perintah xargs menambahkan input standar sebagai argumen di akhir perintah. Ini menimbulkan masalah saat Anda perlu menggunakannya sebelum argumen terakhir.
Misalnya, jika Anda menggunakan perintah pindah, Anda memerlukan sumbernya terlebih dahulu dan kemudian targetnya. Jika Anda ingin memindahkan file yang ditemukan ke direktori target, perintah ini tidak akan berfungsi:
[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p mv new_dir
mv new_dir ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...y
mv: target './rose.txt' is not a directory
Di sinilah Anda dapat menggunakan placeholder di xargs dengan opsi -Saya suka ini:
[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p -I {} mv {} new_dir
mv ./three_lotus.txt new_dir ?...n
mv ./two_lotus.txt new_dir ?...n
mv ./lily.txt new_dir ?...n
mv ./rose.txt new_dir ?...n
Anggap saja seolah-olah xargs mendapatkan semua nama file dari perintah find dan menyimpannya di {}. Kemudian ia menuju ke perintah mv dan memasok konten {}.
Perbedaan utama di sini adalah bahwa alih-alih meletakkan semua nama file dalam perintah yang sama, ia menambahkannya satu per satu. Inilah sebabnya mengapa perintah mv dipanggil untuk setiap argumen (seperti yang Anda lihat pada contoh di atas).
Catatan:Saya menggunakan {} sebagai pengganti. Anda dapat menggunakan sebagian besar huruf atau karakter lain sebagai pengganti. {} adalah taruhan yang aman dan mudah dipahami serta dibedakan.
Menjalankan banyak perintah dengan xargs
Anda dapat menggunakan placeholder untuk menjalankan beberapa perintah dengan xargs.
[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -I {} sh -c 'ls -l {}; du -h {}'
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./three_lotus.txt
0 ./three_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./two_lotus.txt
0 ./two_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./lily.txt
0 ./lily.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./rose.txt
0 ./rose.txt
Ingatlah bahwa placeholder tidak akan meluas ke pengalihan pipa berikutnya atau perintah lainnya. Inilah mengapa saya menggunakan perintah sh di sini.
Selalu ada lagi…
Saya terutama menggunakan perintah find dengan xargs dalam contoh di sini karena itulah yang paling sering Anda lihat. Namun bukan berarti xargs dibatasi untuk digunakan dengan perintah find saja. Salah satu contoh praktis dari perintah xargs adalah ketika Anda ingin menghentikan semua container buruh pelabuhan yang sedang berjalan:
docker ps -q | xargs docker stop
Seperti kebanyakan perintah Linux lainnya, ada lebih banyak opsi dengan xargs juga. Anda selalu dapat merujuk ke halaman manual perintah xargs untuk informasi lebih lanjut.
Saya pikir contoh perintah xargs yang tercantum di sini cukup untuk memberi Anda pemahaman yang baik tentang perintah yang luar biasa ini.
Jika Anda memiliki pertanyaan atau saran, beri tahu saya di bagian komentar.