xargs -Saya opsi

12

The pengguna xargs mengatakan:

-Saya ganti-str - ganti
[= ganti-str]
-i [ganti-str]
Ganti kemunculan replace-str dalam argumen awal dengan nama yang dibaca dari input standar.

Saya tidak mengerti bagian ini: with names read from standard input.

Misalnya apa yang terjadi dengan:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo | wc -l

Sepotong kode di atas menghitung total file / direktori di dalam direktori.

Adakah yang bisa menjelaskan ini untuk saya?

sjsam
sumber

Jawaban:

20

"dengan nama yang dibaca dari input standar" berarti xargsmengambil data yang masuk pada input standarnya, membaginya, dan menggunakannya untuk menjalankan perintah yang diberikan dalam argumennya. Secara default, ia terpecah pada baris kosong atau baris baru, dan berjalan echodengan sebanyak mungkin argumen sekaligus.

The -0pilihan dalam contoh Anda memerintahkan xargsuntuk membagi masukan pada nol byte bukan kosong atau baris baru. Dikombinasikan dengan find's -print0, ini memungkinkan nama file yang berisi kosong atau baris baru yang akan ditangani dengan baik.

The -Ipilihan mengubah cara baris perintah baru dibangun. Alih-alih menambahkan argumen sebanyak mungkin dalam satu waktu, xargsakan mengambil satu nama sekaligus dari inputnya, mencari token yang diberikan (di {}sini) dan menggantinya dengan nama tersebut.

Dalam contoh Anda, {}tidak ada dalam templat perintah yang diberikan xargs, sehingga berlaku xargsdiperintahkan untuk berjalan echotanpa argumen, sekali untuk setiap nama file yang diberikan kepadanya find. Untuk melihat ini, jatuhkan wc:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo

Anda akan melihat serangkaian garis kosong ... Bandingkan dengan ini

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo {}

dan

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 echo

dan

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0

untuk mendapatkan pemahaman yang lebih baik.

Stephen Kitt
sumber