Xargs pelbagai threaded dengan contoh

Xargs pelbagai threaded dengan contoh

Sekiranya anda baru Xargs, atau tidak tahu apa Xargs Namun, sila baca Xargs kami untuk pemula dengan contoh terlebih dahulu. Sekiranya anda sudah agak biasa Xargs, dan boleh menulis asas Xargs Kenyataan baris perintah tanpa melihat manual, maka artikel ini akan membantu anda menjadi lebih maju dengan Xargs pada baris arahan, terutamanya dengan menjadikannya pelbagai threaded.

Dalam tutorial ini anda akan belajar:

  • Bagaimana nak guna Xargs -P (mod pelbagai threaded) dari baris arahan di bash
  • Contoh penggunaan lanjutan menggunakan pelbagai threaded Xargs dari baris arahan di bash
  • Pemahaman yang lebih mendalam tentang cara memohon Xargs pelbagai threaded ke kod bash anda yang ada
Xargs pelbagai threaded dengan contoh

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran linux-bebas
Perisian Baris perintah bash, sistem berasaskan linux
Yang lain The Xargs Utiliti dimasukkan ke dalam shell bash secara lalai
Konvensyen # - memerlukan komando linux untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-Memerlukan komando linux untuk dilaksanakan sebagai pengguna yang tidak istimewa

Contoh 1: Memanggil shell bash lain dengan input yang disusun Xargs



Selepas satu kegunaan untuk belajar Xargs, dia akan segera menemuinya - sedangkan Xargs membolehkan seseorang melakukan banyak perkara yang berkuasa dengan sendirinya - kuasa Xargs Nampaknya terhad oleh ketidakupayaan untuk melaksanakan pelbagai arahan dalam urutan.

Contohnya, katakan kita mempunyai direktori yang mempunyai subdirektori yang dinamakan 00 ke 10 (11 secara keseluruhan). Dan, bagi setiap subdirektori ini, kami ingin melintasinya, dan periksa apakah fail yang dinamakan fail.txt ada, dan jika demikian kucing (dan bergabung menggunakan >>) kandungan fail ini ke fail total_file.txt di direktori di mana 00 ke 10 Direktori adalah. Mari cuba dan buat ini dengan Xargs Dalam pelbagai langkah:

$ mkdir 00 01 02 03 04 05 06 07 08 09 10 $ ls 00 01 02 03 04 05 06 07 08 09 10 $ echo 'a'> 03/fail.txt $ echo 'b'> 07/fail.txt $ echo 'c'> 10/fail.txt 

Di sini kita mula -mula membuat 11 direktori, 00 ke 10 dan seterusnya membuat 3 sampel fail.txt fail dalam subdirektori 03, 07 dan 10.

$ cari . -MaxDepth 2 -Type F -name File.txt ./10/fail.txt ./07/fail.txt ./03/fail.txt 

Kami kemudian menulis a cari perintah untuk mencari semua fail.txt fail bermula pada direktori semasa (.) dan sehingga maksimum 1 tahap subdirektori:

$ cari . -MaxDepth 2 -Type F -name File.txt | Xargs -i  Cat > ./total_file.txt $ kucing total_file.txt c b a 

The -MaxDepth 2 menunjukkan direktori semasa (1) dan Semua subdirektori direktori ini (Oleh itu MaxDepth daripada 2).

Akhirnya kita gunakan Xargs (Dengan yang disyorkan dan disukai rentetan pengganti seperti yang dihantar ke Xargs -I Ganti rentetan pilihan) untuk kucing kandungan mana -mana fail tersebut yang terletak di cari perintah ke dalam fail dalam direktori semasa yang dinamakan total_file.txt.

Sesuatu yang baik untuk diperhatikan di sini ialah, walaupun seseorang akan berfikir Xargs Selanjutnya melaksanakan pelbagai kucing arahan semua mengalihkan ke fail yang sama, seseorang boleh menggunakan > (output ke fail baru, membuat fail jika belum wujud, dan menimpa sebarang fail dengan nama yang sama ada di sana) bukannya >> (tambah ke fail, dan buat fail jika belum ada)!



Latihan setakat ini lebih kurang memenuhi keperluan kami, tetapi ia tidak sesuai dengan keperluannya - iaitu, ia tidak melintasi subdirektori. Ia juga tidak menggunakan >> Pengalihan seperti yang dinyatakan, walaupun menggunakannya dalam kes ini masih akan berjaya.

Cabaran dengan menjalankan pelbagai arahan (seperti yang spesifik CD arahan yang diperlukan untuk menukar direktori/melintasi subdirektori) dari dalam Xargs adakah itu 1) mereka sangat sukar untuk kod, dan 2) mungkin tidak mungkin untuk kod ini sama sekali.

Walau bagaimanapun, ada cara yang berbeza dan mudah difahami untuk mengodkan ini, dan apabila anda tahu bagaimana untuk melakukan ini, anda mungkin akan menggunakannya dengan banyak. Mari menyelam masuk.

$ rm total_file.txt 

Kami mula -mula membersihkan output sebelumnya.

$ ls -d-color = never [0-9] [0-9] | xargs -i  echo 'cd ; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi 'CD 00; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 01; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 02; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 03; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 04; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 05; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 06; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 07; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 08; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; Fi CD 09; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; fi cd 10; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; fi 

Seterusnya, kami merumuskan arahan, kali ini menggunakan ls yang akan menyenaraikan semua direktori yang sesuai dengan [0-9] [0-9] Ekspresi Biasa (Baca artikel Bash Regex kami dengan contoh untuk maklumat lanjut mengenai ungkapan biasa).

Kami juga menggunakan Xargs, Tetapi kali ini (berbanding dengan contoh sebelumnya) dengan echo perintah yang akan mengeluarkan apa yang ingin kami lakukan, walaupun ia memerlukan lebih banyak daripada satu atau banyak arahan. Fikirkan ini seperti skrip mini.

Kami juga menggunakan cd untuk berubah menjadi direktori seperti yang disenaraikan oleh ls -d (Direktori sahaja) Perintah (yang sebagai nota sampingan dilindungi oleh --warna = tidak pernah fasal menghalang sebarang kod warna di ls output dari miring hasil kami), dan periksa sama ada fail fail.txt ada di subdirektori dengan menggunakan jika [-r .. perintah. Sekiranya ia wujud, kami kucing The fail.txt ke dalam ... /total_file.txt. Perhatikan sebagai cd Dalam perintah telah meletakkan kita ke dalam subdirektori!

Kami menjalankan ini untuk melihat bagaimana ia berfungsi (selepas semua, hanya echo dilaksanakan; Tidak ada yang sebenarnya akan berlaku). Kod yang dihasilkan kelihatan hebat. Mari ambil satu langkah lebih jauh sekarang dan sebenarnya melaksanakan perkara yang sama:

$ ls -d-color = never [0-9] [0-9] | xargs -i  echo 'cd ; jika [-r ./fail.txt]; kemudian fail kucing.txt >> ... /total_file.txt; fi '| xargs -i  bash -c "" $ Cat total_file.txt a b c 


Kami kini melaksanakan skrip total dengan menggunakan spesifik (dan selalu sama, i.e. Anda akan mendapati diri anda menulis | xargs -i bash -c "" dengan beberapa keteraturan) arahan, yang melaksanakan apa sahaja yang dihasilkan oleh echo sebelum ini: xargs -i bash -c "". Pada dasarnya ini memberitahu penterjemah bash untuk melaksanakan apa sahaja yang diserahkan kepadanya - dan ini untuk sebarang kod yang dihasilkan. Sangat kuat!

Contoh 2: Xargs pelbagai threaded

Di sini kita akan melihat dua yang berbeza Xargs arahan, yang dilaksanakan tanpa pelaksanaan selari (berbilang threaded), yang lain dengan. Pertimbangkan perbezaan antara dua contoh berikut:

$ masa untuk saya dalam $ (seq 1 5); lakukan echo $ [$ random % 5 + 1]; Selesai | xargs -i  echo "tidur ; echo 'selesai!  '"| xargs -i  bash -c"  "selesai! 5 Selesai! 5 Selesai! 2 selesai! 4 Selesai! 1 Real 0m17.016S USER 0M0.017S SYS 0M0.003s 
$ masa untuk saya dalam $ (seq 1 5); lakukan echo $ [$ random % 5 + 1]; Selesai | xargs -i  echo "tidur ; echo 'selesai!  '"| xargs -p5 -i  bash -c"  "selesai! 1 selesai! 3 Selesai! 3 Selesai! 3 Selesai! 5 Real 0m5.019S USER 0M0.036S SYS 0M0.015s 

Perbezaan antara dua baris perintah sebenar adalah kecil; Kami hanya menambah -P5 dalam baris arahan kedua. Walau bagaimanapun, runtime (seperti yang diukur oleh masa awalan arahan) adalah penting. Mari kita ketahui mengapa (dan mengapa output berbeza!).



Dalam contoh pertama, kami membuat a untuk gelung yang akan berjalan 5 kali (kerana subshell $ (seq 1 5) menjana nombor dari 1 ke 5) dan di dalamnya kita echo nombor rawak antara 1 dan 5. Seterusnya, selaras dengan contoh terakhir, kami menghantar output ini ke dalam arahan tidur, dan juga mengeluarkan tempoh tidur sebagai sebahagian daripada yang dilakukan! echo. Akhirnya kami menghantar ini untuk dikendalikan oleh perintah Subshell Bash, sekali lagi dengan cara yang sama dengan contoh terakhir kami.

Output perintah pertama berfungsi seperti ini; laksanakan hasil tidur, output, laksanakan tidur seterusnya, dan sebagainya.

Perintah kedua bagaimanapun mengubahnya sepenuhnya. Di sini kami tambah -P5 yang pada dasarnya bermula 5 benang selari sekaligus!

Cara perintah ini berfungsi adalah: Mulakan hingga X Threads (seperti yang ditakrifkan oleh pilihan -P) dan memprosesnya secara serentak. Apabila utas selesai, ambil input baru dengan segera, jangan tunggu benang lain selesai terlebih dahulu. Bahagian terakhir penerangan itu tidak terpakai di sini (hanya jika terdapat kurang benang yang ditentukan oleh -P maka bilangan 'garis' input yang diberikan, atau dengan kata lain yang kurang benang selari akan tersedia maka bilangan baris input).

Hasilnya adalah bahawa benang yang selesai terlebih dahulu - mereka yang mempunyai masa tidur rawak yang singkat - kembali dahulu, dan mengeluarkan 'mereka selesai!'Penyataan. Jumlah runtime juga turun dari kira -kira 17 saat hingga kira -kira 5 saat tepat pada waktu jam sebenar. Sejuk!

Kesimpulan

Menggunakan Xargs adalah salah satu yang paling maju, dan juga salah satu cara yang paling berkuasa, untuk kod di bash. Tetapi ia tidak berhenti menggunakan hanya Xargs! Dalam artikel ini, kami meneroka pelaksanaan selari pelbagai threaded melalui -P pilihan untuk Xargs. Kami juga melihat memanggil Subshells menggunakan $ () dan akhirnya kami memperkenalkan kaedah untuk lulus kenyataan pelbagai arahan terus ke Xargs dengan menggunakan a bash -c Subshell Call.

Berkuasa? Kami fikir begitu! Tinggalkan kami pemikiran anda.

Tutorial Linux Berkaitan:

  • Contoh bagaimana menggunakan arahan Xargs di Linux
  • Pengurusan skrip & proses bash berbilang threaded di…
  • Xargs untuk pemula dengan contoh
  • Menguasai Gelung Skrip Bash
  • Cara Menggunakan Subshells Bash Di dalam Jika Kenyataan
  • Perintah Linux Asas
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Perintah Linux: Top 20 Perintah Paling Penting yang Anda Perlu ..
  • Sistem Hung Linux? Cara melarikan diri ke baris arahan dan ..
  • Perkara yang hendak dipasang di Ubuntu 20.04