Apa penggunaan xargs -exec dan -print0?

20

Saya pikir ini adalah cara umum untuk meneruskan hasil dari satu perintah ke yang berikutnya, sebagai input.

Bagaimana ketiganya bekerja? Atau apakah beberapa situs web / URL?

James Bond
sumber

Jawaban:

25

Hal pertama yang harus diketik:

man find

man xargs

The findperintah cetak hasil ke output standar secara default, sehingga -printopsi biasanya tidak diperlukan, tetapi -print0memisahkan nama file dengan (NULL) byte 0 sehingga nama-nama yang mengandung spasi atau baris dapat diartikan dengan benar.

The -execpilihan adalah sesuatu yang Anda dapat menggunakan bukan xargs - perintah find mengeksekusi perintah untuk setiap item yang ditemukan.

The xargsperintah membaca string ruang angkasa atau baris baru dipisahkan (biasanya dari find perintah, tapi mereka bisa datang dari mana saja) dan mengeksekusi beberapa perintah untuk setiap string.
Jika xargs dijalankan dengan opsi -0 , itu akan mengharapkan string yang dipisahkan NULL sebagai keluaranfind ... -print0

Keuntungan dari xargs adalah bahwa ia dapat mengelompokkan string bersama, sehingga hanya mengeksekusi perintah sekali atau dua kali alih-alih n kali.

Jadi dalam penggunaan normal:

find start_directory -name '*.txt' | xargs ls -l 

find akan mencantumkan nama file, dan xargs akan mengeluarkan perintah seperti:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

yang lebih cepat daripada memiliki perintah find Anda mengeluarkan:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt
njd
sumber
7

Perhatikan bahwa xargs tidak diperlukan lagi dengan implementasi find saat ini yang mungkin semuanya mendukung sintaks POSIX ini:

find directory -name '*.txt' -exec ls -l {} + 

yang lebih sederhana dan sedikit lebih cepat dari varian xargs.

find directory -name '*.txt' | xargs ls -l 
Jlliagre
sumber
xargs menggunakan sumber daya yang jauh lebih sedikit daripada 'find -exec'
Felipe Alvarez
7
Itu sebaliknya. Perpipaan ke xargs akan menggunakan sumber daya sedikit lebih banyak daripada -exec. Anda mungkin mengabaikan terminator "+".
jlliagre