Belajar dengan membaca secara berurutan

xargs — Membangun Perintah dari Standard Input

Susun standard input sebagai argumen dengan echo a b | xargs echo, jalankan satu kata sekali dengan -n1, sisipkan nilai ke {} dengan -I{}, dan proses massal find . -name '*.log' | xargs — dengan diagram dan terminal langsung.

Mengubah Standard Input jadi Argumen — xargs dan -n1

Pipe meneruskan output perintah sebelumnya sebagai standard input perintah berikutnya. Tetapi rm dan echo tidak membaca standard input — keduanya hanya bekerja pada nilai yang ditulis sebagai argumen. xargs adalah perintah yang mengambil apa yang diterimanya di standard input dan menyusunnya jadi argumen untuk perintah yang kamu tulis sesudahnya, jadi dengan echo a b | xargs echo, a dan b menjadi argumen untuk echo di belakang.

Secara default, xargs meneruskan kata-kata yang diterimanya ke satu kali jalan, digabung sebanyak mungkin. Tambahkan -n1 dan ia memecahnya, menjalankan perintah sekali per kata.

SintaksYang dilakukan
| xargsSusun input sebagai argumen lalu jalankan perintah
xargs -n1Jalankan perintah sekali per argumen
xargs -I{}Ganti {} dengan input dan sisipkan di mana saja
find ... | xargsJalankan satu proses massal pada yang ditemukan
| xargs echo rmCetak perintah yang akan dijalankan, untuk mengeceknya dulu
xargs menyusun ulang input jadi argumen
echo a b cstandard inputa b c| xargs echo| xargs -n1 echoecho a b cdigabung, 1 jalanecho a / b / c1 kata, 3 jalanoutputpipe masukpipe masukjalan sekalijalan per kata
Output echo di-pipe ke xargs sebagai standard input dan disusun ulang jadi argumen. Satu jalan tergabung, atau tiga jalan satu kata sekali — itulah perbedaan yang dibuat -n1.
printf 'one two three\n' | xargs echo got:        # got: one two three (digabung, 1 jalan)
printf 'one\ntwo\nthree\n' | xargs -n1 echo item:  # item: one / item: two / item: three

① Buat file sumber 3 baris dengan printf 'red\ngreen\nblue\n' > colors.txt.

② Pipe output dari cat colors.txt ke xargs, menyusun kata-kata sebagai argumen untuk echo agar tercetak semua dalam satu jalan tergabung.

③ Berikan input yang sama ke xargs dengan opsi yang memecahnya satu kata sekali, lalu pastikan echo berjalan tiga kali, satu baris masing-masing. (Begitu kamu menjalankannya dengan benar, penjelasan akan muncul.)

Linux console
0 / 3 selesai
Loading Linux Terminal...

Replace String dan Integrasi find — -I{}

xargs -I{} membangun perintah dengan menyisipkan setiap baris input ke posisi `{}`. Karena {} bisa diletakkan di mana saja yang kamu mau, termasuk di tengah perintah, kamu bisa menjalankan bentuk seperti echo file_{}.txt — dengan teks tetap di sekitar nilai — satu baris sekali.

Saat kamu ingin menjalankan sesuatu pada file yang ditemukan find, bentuk find ... | xargs adalah yang standar. xargs menyusun path yang dicetak find sebagai argumen lalu menjalankan satu proses massal atas hasil pencarian. Padukan dengan -I{} dan kamu bisa memproses setiap path yang ditemukan dengan menyisipkannya satu per satu ke `{}`.

Memproses yang ditemukan find dengan xargs
find . -name '*.log'a.logb.log| xargs -I{} echo {}sisipkan tiap bariske {}echo a.logecho b.logcetak pathpipe masukjalankan baris 1jalankan baris 2
Path yang dicetak find diteruskan ke xargs sebagai satu baris = satu item, dan -I{} menyisipkan masing-masing ke `{}` lalu menjalankannya satu per satu.
printf 'alpha\nbeta\n' | xargs -I{} echo 'name = {}'   # name = alpha / name = beta
mkdir -p logs                                          # buat direktori sumber
touch logs/a.log logs/b.log                             # buat 2 file
find logs -name '*.log' | xargs -I{} echo 'found {}'    # found logs/a.log / found logs/b.log

① Tambahkan opsi replace-string ke printf 'cat\ndog\n' | xargs dan cetak setiap input yang disisipkan ke {} di pet = {}.

② Buat direktori dengan mkdir -p data, lalu buat dua file dengan touch data/x.txt data/y.txt.

③ Pipe output dari find data -name '*.txt' ke xargs dan pakai replace string untuk menyisipkan setiap path ke {} di echo 'hit {}'.

④ Jalankan juga find data -name '*.txt' | xargs echo yang polos dan bandingkan dengan bentuk di mana, tanpa -I{}, path-path berbaris di akhir.

Linux console
0 / 5 selesai
Loading Linux Terminal...

Memproses Satu per Satu — Memilih antara -n1 dan -I{}

Baik -n1 maupun -I{} menjalankan perintah satu item sekali, tetapi keduanya berbeda dalam ke mana nilai masuk dan bagaimana input dipecah. -n1 meneruskan kata (potongan yang dipisah spasi atau baris baru) satu per satu sebagai argumen di belakang perintah. -I{} mengambil baris satu per satu dan menyisipkannya ke posisi tempat kamu menulis `{}`.

Pakai `-n1` saat kamu cukup butuh nilai di akhir, dan `-I{}` saat kamu mau teks tetap di sekitar nilai, seperti {}.bak.

Aspek`-n1``-I{}`
Ke mana nilai masukBerbaris di akhir perintahMasuk ke tempat kamu menulis {}
Satuan pemecahanKata (dipisah spasi/baris baru)Baris (satu baris = satu item)
Cocok untukSekadar meneruskan argumen bergiliranMembangun bentuk dengan teks tetap di sekitar nilai
printf 'a\nb\n' | xargs -n1 echo prefix       # prefix a / prefix b (di akhir)
printf 'a\nb\n' | xargs -I{} echo {}_done      # a_done / b_done (disisipkan di tengah perintah)

① Tambahkan opsi yang menjalankan satu kata sekali ke printf 'log1\nlog2\n' | xargs, meneruskannya satu per satu sebagai argumen untuk echo file.

② Berikan input yang sama ke xargs dan pakai opsi replace-string untuk menyisipkannya ke {} di echo {}.bak.

③ Bandingkan bagaimana output berubah antara berbaris di akhir dan disisipkan di tengah perintah.

Linux console
0 / 2 selesai
Loading Linux Terminal...

Proses Massal dalam Praktik — Cek Sebelum Menjalankan

Dalam pekerjaan nyata, kamu memakai xargs untuk copy massal dan hapus massal atas target yang dikumpulkan find. Karena -I{} bisa menyisipkan nilai yang sama ke dua tempat atau lebih, ia bekerja dengan perintah yang menerima dua argumen seperti cp source dest, sehingga kamu bisa membuat backup "nama asli + .bak" sekaligus.

Jangan langsung menjalankan operasi yang tidak bisa dibatalkan seperti rm. Jika kamu menjalankan xargs echo rm sebelum xargs rm, perintah yang akan dijalankan hanya dicetak dan tidak ada yang terhapus. Cek target yang terdaftar, lalu lepaskan echo dan jalankan sungguhan — pendekatan dua langkah cek-lalu-jalan ini adalah cara yang aman.

Cek hapus massal dengan mencetak sebelum menjalankan
find . -name '*.tmp'a.tmpb.tmp| xargs echo rm| xargs rmrm a.tmp b.tmphanya dicetakhapus keduafile sekaliguscetak target① cek dulu② setelah yakintak ada terhapusjalankan sungguhan
Untuk operasi yang tidak bisa dibatalkan, selipkan echo sebelum rm agar target tercek dengan dicetak dulu, lalu jalankan.
mkdir -p cache
touch cache/a.tmp cache/b.tmp
find cache -name '*.tmp' | xargs echo rm   # hanya mencetak rm cache/a.tmp cache/b.tmp
find cache -name '*.tmp' | xargs rm        # jalankan sungguhan setelah yakin

① Buat direktori kerja dengan mkdir -p work, lalu buat dua file sumber dengan touch work/note1.txt work/note2.txt.

② Pipe output dari find work -name '*.txt' ke xargs dan pakai replace string untuk menyalin setiap file ke "nama asli dengan .bak ditambahkan."

③ Pastikan dengan ls work bahwa dua file .bak sudah bertambah.

④ Berikan output dari find work -name '*.bak' ke xargs, selipkan echo sebelum perintah hapus, dan cek perintah hapus yang akan dijalankan dengan hanya mencetaknya.

⑤ Jika target yang terdaftar terlihat aman, lepaskan echo, hapus file .bak sekaligus, dan pastikan lagi dengan ls work bahwa keduanya sudah hilang.

Linux console
0 / 6 selesai
Loading Linux Terminal...
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Mana yang dengan benar menjelaskan apa yang dilakukan xargs?

Soal 2Bagaimana printf 'a\nb\nc\n' | xargs -n1 echo berperilaku?

Soal 3Apa yang diwakili {} dalam xargs -I{}?