xargs -Saya ganti opsi str-str

16

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 fileperintah 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.

tinjauan ke masa depan
sumber
3
"Jika opsi -I tidak ditentukan, ini adalah default untuk -I {}" - ini tidak benar, setidaknya dengan GNU xargs.
jjlin
Saya mengerti kesalahan saya. Saya harus menentukan salah satu xargs fileatau xargs -I{} file {}. Seharusnya tidak xargs file {}. Saya kira ketika secara eksplisit menentukan -I {}, bash akan memperlakukannya sebagai file "Hello World". Tanpa -I {}, itu diperlakukan sebagai file Hello World.
foresightyj
1
(1) Diskusi ini tidak ada hubungannya dengan shell (bash). (2) Ada baiknya Anda tahu -1opsi untuk ls, tetapi aktif secara default ketika output dari lsfile atau pipa, jadi Anda tidak membutuhkannya di sini. (3) Anda bingung -Idengan opsi -i(huruf kecil I) yang sudah usang . -ifoosama dengan -Ifoo, tetapi polos -isama dengan -I{}. Tapi gunakan -I{}. (4) Jika Anda benar-benar ingin melakukan apa yang Anda katakan ingin Anda lakukan, mengapa tidak katakan saja file *?
Scott
@Scott Maksud asli saya adalah menulis `find. -nama "* .mov" | xargs -Saya {} file {} `untuk menemukan semua file mov secara rekursif dan berjalan filedi atasnya. Tapi saya datang dengan contoh sederhana menggunakan ls. Kamu benar. Untuk itu, file *adalah yang terbaik.
foresightyj
1
temukan telah -exec.
Cristian Ciupitu

Jawaban:

20

The -Imembutuhkan sebuah tempat yang ditentukan. The -ipilihan akan menganggap {}adalah placeholder. Di sinilah saya menemukan asumsi {} man xargssetidaknya pada Cygwin dan CentOS.

xargs yang dipanggil tanpa salah satu opsi tidak membutuhkan placeholder dan itu hanya menambahkan STDIN pada akhir argumen.

Tambahkan saja echocontoh Anda untuk melihat apa yang dilakukan xargs:

$ ls -1
Hello World/

Contoh Anda mistakeny menggunakan {}:

$ ls -1 | xargs echo file {}
file {} Hello World/

jadi filecmd melihat argumen {} Hello Worlddan kesalahan.

Jika Anda ingin menggunakan {}panggilan xargs Anda secara eksplisit :

$ ls -1 | xargs -i echo file {}
file Hello World/

Atau Tanpa placeholder:

$ ls -1 | xargs echo file
file Hello World/

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:

$ ls -1 | xargs -i mv {} /path/to/someplace/.
johnnyB
sumber
Itu sangat jelas. Meskipun jawaban Anda agak terlambat, tetapi membacanya benar-benar memperkuat pemahaman saya.
foresightyj