Perbedaannya terletak pada data apa yang diterima oleh program target.
Jika Anda hanya menggunakan pipa, ia menerima data pada STDIN (aliran input standar) sebagai tumpukan data mentah yang dapat disortir melalui satu baris pada satu waktu. Namun beberapa program tidak menerima perintah mereka pada standar di, mereka berharap itu akan dijabarkan dalam argumen ke perintah. Misalnya touch
mengambil nama file sebagai parameter pada baris perintah seperti: touch file1.txt
.
Jika Anda memiliki program yang output nama-nama file pada standar keluar dan ingin menggunakannya sebagai argumen untuk touch
, Anda harus menggunakan xargs
yang membaca data aliran STDIN dan mengkonversi setiap baris ke ruang angkasa dipisahkan argumen untuk perintah.
Dua hal ini setara:
# touch file1.txt
# echo file1.txt | xargs touch
Jangan gunakan xargs
kecuali Anda tahu persis apa yang dilakukannya dan mengapa itu diperlukan. Sering terjadi bahwa ada cara yang lebih baik untuk melakukan pekerjaan daripada menggunakan xargs
untuk memaksa konversi. Proses konversi juga penuh dengan jebakan potensial seperti melarikan diri dan ekspansi kata dll.
xargs
dan$(...)
), xargs jauh lebih aman daripada penggantian perintah. Dan saya tidak ingat pernah menemukan nama file yang sah dengan baris baru di dalamnya. Bukankah masalah pelarian dan perluasan kata dengan substitusi perintah, bukan xargs?xargs -0
), yang berguna bersamaanfind -print0
.xargs
memanggil program melalui shell dengan spasi yang terpisah, atau apakah itu benar-benar membangun daftar argumen secara internal (mis. Untuk digunakan denganexecv
/execp
)?-d \n
, meskipun BSD xargs (OSX et al) tampaknya tidak mendukung opsi ini.Untuk memperluas jawaban yang sudah disediakan,
xargs
dapat melakukan satu hal keren yang menjadi semakin penting dalam lanskap komputasi multicore dan terdistribusi saat ini: dapat melakukan pekerjaan paralel.Sebagai contoh:
akan menyandikan * .wav => * .flac, menggunakan tiga proses sekaligus (
-P 3
).sumber
-exec
Parameter tidak akan memproses pekerjaan paralel.-0
argumen untukxargs
membuatnya mempertimbangkanNULL
karakter sebagai pembatas item input.find -print0
menampilkan item-item yang dibatasi-NULL. Ini adalah praktik yang bagus untuk nama file yang mungkin mengandung spasi, tanda kutip, atau karakter khusus lainnya.xargs sangat berguna ketika Anda memiliki daftar filepath di stdin dan ingin melakukan sesuatu dengannya. Sebagai contoh:
Mari kita periksa langkah demi langkah:
Dengan kata lain, input kami adalah daftar jalur yang ingin kami lakukan sesuatu.
Untuk mengetahui apa yang dilakukan xargs dengan path ini, trik yang bagus adalah menambahkan
echo
sebelum perintah Anda, seperti:The
-n 1
Argumen akan membuat xargs berubah setiap baris menjadi perintah sendiri. Thesed -i "s/color/colour/g"
perintah akan mengganti semua kejadian daricolor
dengancolour
untuk file yang ditentukan.Perhatikan bahwa ini hanya berfungsi jika Anda tidak memiliki spasi di jalur Anda. Jika Anda melakukannya, Anda harus menggunakan jalur terminasi nol sebagai input ke xargs dengan melewati
-0
flag. Contoh penggunaannya adalah:Yang melakukan hal yang sama seperti apa yang kami jelaskan di atas, tetapi juga berfungsi jika salah satu jalur memiliki ruang di dalamnya.
Ini berfungsi dengan perintah apa pun yang menghasilkan nama file sebagai keluaran seperti
find
ataulocate
. Jika Anda menggunakannya di repositori git dengan banyak file, mungkin lebih efisien untuk menggunakannya dengangit grep -l
daripadagit ls-files
, seperti:The
git grep -l "color" "*.tex"
perintah akan memberikan daftar "* tex" file yang berisi frasa "warna".sumber
Argumen pertama Anda menggambarkan perbedaan dengan cukup baik.
\ls | grep Cases | less
memungkinkan Anda menelusuri daftar nama file yang dihasilkan olehls
dangrep
. Tidak masalah mereka kebetulan nama file, mereka hanya beberapa teks.\ls | grep Cases | xargs less
memungkinkan Anda menelusuri file yang namanya dihasilkan oleh bagian pertama dari perintah.xargs
mengambil daftar nama file sebagai input dan perintah dalam baris perintah, dan menjalankan perintah dengan nama file pada nya baris perintah.Ketika mempertimbangkan untuk menggunakan
xargs
, ingatlah bahwa ia mengharapkan input diformat dengan cara yang aneh: whitespace-delimited, with\
,'
dan"
digunakan untuk mengutip (dengan cara yang tidak biasa, karena\
tidak ada kutipan dalam khusus). Hanya gunakanxargs
jika Anda nama file Anda tidak mengandung spasi atau\'"
.sumber
xargs
memiliki-0, --null
opsi untuk mengatasi masalah spasi (kemungkinan besar saya mengetahui hal itu dari Anda :), jadi saya berasumsi bahwa Anda merujuk pada panggilan tidak-pilihanxarg
, tapi saya bingung dengan referensi Anda pada tanda kutip. Apakah Anda memiliki tautan atau contoh tentang itu? .. (ps.| xargs less
adalah "tipuan" berguna +1 .. terima kasih ..Dalam contoh Anda, Anda tidak perlu menggunakan
xargs
sama sekali karenafind
akan melakukan dengan tepat dan aman apa yang ingin Anda lakukan.Apa yang ingin Anda gunakan
find
adalah:Dalam contoh ini
-maxdepth 1
berarti hanya mencari di direktori saat ini, jangan turun ke subdirektori mana pun; secara default find akan terlihat di semua subdirektori (yang sering kali Anda inginkan) kecuali Anda membatasi dengan maxdepth. The{}
adalah nama file yang akan mendapatkan diganti di tempatnya dan+
merupakan salah satu dari dua end-of-perintah penanda, makhluk lainnya;
. Perbedaan di antara mereka adalah itu;
berarti exec perintah pada setiap file satu per satu, sedangkan+
berarti exec perintah pada semua file sekaligus. Perhatikan, bagaimanapun, bahwa shell Anda mungkin akan mencoba menafsirkannya;
sendiri, jadi Anda harus menghindarinya dengan salah satu\;
atau';'
. Ya,find
memiliki sejumlah gangguan kecil seperti ini, tetapi kekuatannya lebih dari menebusnya.Kedua
find
danxargs
rumit untuk belajar pada awalnya. Untuk membantu Anda belajar,xargs
coba gunakan opsi-p
atau--interactive
yang akan menunjukkan kepada Anda perintah yang akan dijalankan dan menanyakan apakah Anda ingin menjalankannya atau tidak.Demikian pula dengan
find
Anda dapat menggunakan-ok
di tempat-exec
untuk meminta Anda apakah Anda ingin menjalankan perintah atau tidak.Ada saat-saat ketika
find
tidak akan dapat melakukan semua yang Anda inginkan dan di situlahxargs
masuk.-exec
Perintah hanya akan menerima satu contoh{}
muncul, jadi jika Anda akan mendapatkan kesalahan denganfind -type f -exec cp {} {}.bak \;
begitu Anda bisa melakukannya seperti :find -type f -print0 | xargs -0 -l1 -IX cp X X.bak
Anda dapat mempelajari lebih lanjut tentang Menjalankan Perintah di manual GNU Findutils .
Juga, saya menyebutkan bahwa
find
melakukan apa yang Anda inginkan dengan aman karena ketika Anda berurusan dengan file, Anda akan menemukan spasi dan karakter lain yang akan menyebabkan masalahxargs
kecuali Anda menggunakan opsi-0
atau--null
bersama dengan sesuatu yang menghasilkan item input yang diakhiri oleh karakter nol sebagai gantinya ruang putih.sumber
'
atau"
bisa bermasalah, sedangkanfind
akan menangani kasus-kasus itu tanpa masalah.xargs
(bersama denganfind
,sort
,du
,uniq
,perl
dan beberapa orang lainnya) menerima saklar baris perintah untuk mengatakan "STDIN memiliki daftar file, dipisahkan oleh NUL (0x00) byte". Ini membuatnya mudah untuk menangani nama file dengan spasi dan karakter lucu lainnya di dalamnya. Nama file tidak mengandung NUL.sumber