GNU/Linux >> Belajar Linux >  >> Linux

Cara Menggunakan Perintah Xargs yang Kuat di Linux [Dijelaskan dengan Contoh]

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.


Linux
  1. Cara menggunakan perintah grep Linux

  2. Cara menggunakan perintah history di Linux

  3. Bagaimana Anda menggunakan ekspresi reguler dengan perintah cp di Linux?

  1. Perintah mana di Linux [Dijelaskan dengan Contoh]

  2. Cara Menggunakan Perintah id di Linux

  3. Cara menggunakan perintah "layar" di Linux

  1. Cara Menggunakan Perintah w di Linux dengan Contoh

  2. Cara Menggunakan Perintah sejarah Linux

  3. Cara Menggunakan Perintah Linux Cat (Dengan Contoh)