Dari pemahaman saya, berikut ini harus berarti persis sama:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
jika opsi -I tidak ditentukan, defaultnya adalah -I {}.
Saya ingin membuat daftar semua file di direktori saat ini dan menjalankan file
perintah pada masing-masing. Beberapa memiliki ruang dalam namanya. Namun, saya perhatikan perbedaannya. Lihat di bawah:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
Dengan -I {} ditentukan secara eksplisit, kekosongan dalam nama file diperlakukan seperti yang diharapkan.
xargs file
atauxargs -I{} file {}
. Seharusnya tidakxargs file {}
. Saya kira ketika secara eksplisit menentukan -I {}, bash akan memperlakukannya sebagaifile "Hello World"
. Tanpa -I {}, itu diperlakukan sebagaifile Hello World
.-1
opsi untukls
, tetapi aktif secara default ketika output darils
file atau pipa, jadi Anda tidak membutuhkannya di sini. (3) Anda bingung-I
dengan opsi-i
(huruf kecilI
) yang sudah usang .-ifoo
sama dengan-Ifoo
, tetapi polos-i
sama dengan-I{}
. Tapi gunakan-I{}
. (4) Jika Anda benar-benar ingin melakukan apa yang Anda katakan ingin Anda lakukan, mengapa tidak katakan sajafile *
?file
di atasnya. Tapi saya datang dengan contoh sederhana menggunakanls
. Kamu benar. Untuk itu,file *
adalah yang terbaik.-exec
.Jawaban:
The
-I
membutuhkan sebuah tempat yang ditentukan. The-i
pilihan akan menganggap{}
adalah placeholder. Di sinilah saya menemukan asumsi {}man xargs
setidaknya pada Cygwin dan CentOS.xargs yang dipanggil tanpa salah satu opsi tidak membutuhkan placeholder dan itu hanya menambahkan STDIN pada akhir argumen.
Tambahkan saja
echo
contoh Anda untuk melihat apa yang dilakukan xargs:Contoh Anda mistakeny menggunakan
{}
:jadi
file
cmd melihat argumen{} Hello World
dan kesalahan.Jika Anda ingin menggunakan
{}
panggilan xargs Anda secara eksplisit :Atau Tanpa placeholder:
xargs seperti disebut di atas tidak memerlukan {}. Ini menambahkan STDIN ke akhir perintah tanpa placeholder. Penggunaan {} biasanya berarti Anda ingin menjalankan STDIN di suatu tempat di tengah cmd, seperti pada:
sumber