Nah untuk satu hal -i
saklar sudah usang:
-i[replace-str]
This option is a synonym for -Ireplace-str if replace-str is specified.
If the replace-str argument is missing, the effect is the same as -I{}.
This option is deprecated; use -I instead.
Jadi ketika saya mengubah perintah Anda, ini berhasil:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
Contoh
$ find . -print0 | xargs -I{} -0 echo {}
.
./.sshmenu
./The GIT version control system.html
./.vim_SO
./.vim_SO/README.txt
./.vim_SO/.git
./.vim_SO/.git/objects
./.vim_SO/.git/objects/pack
./.vim_SO/.git/objects/pack/pack-42dbf7fe4a9b431a51da817ebf58cf69f5b7117b.idx
./.vim_SO/.git/objects/pack/pack-42dbf7fe4a9b431a51da817ebf58cf69f5b7117b.pack
./.vim_SO/.git/objects/info
./.vim_SO/.git/refs
./.vim_SO/.git/refs/tags
...
Penggunaan -I{}
Pendekatan ini tidak boleh digunakan sejak menjalankan perintah ini:
$ find -print0 ... | xargs -I{} -0 ...
secara implisit menyalakan sakelar ini ke xargs
, -x
dan -L 1
. The -L 1
mengkonfigurasi xargs
sehingga memanggil perintah yang Anda inginkan untuk menjalankan file melalui secara tunggal.
Jadi ini mengalahkan tujuan penggunaan di xargs
sini karena jika Anda memberikannya 1000 file maka akan menjalankan mv
perintah 1000 kali.
Jadi pendekatan mana yang harus saya gunakan?
Anda dapat melakukannya menggunakan xargs seperti ini:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
Atau temukan saja semuanya:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"
pendekatan mana yang harus digunakan, bukan? Apakah"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"
akan menjadi solusi yang lebih baik? Jika demikian, bagaimana bisaxargs
tahu dalam kasus ini di mana dalammv
perintah untuk memberi makan dalam argumen yang didapatnya dari pipa? (Apakah itu selalu menempatkan mereka sebagai yang terakhir?)find ... -exec ...
adalah cara yang lebih baik atau jika Anda ingin menggunakannyaxargs
jugafind ... | xargs ... mv -t ...
tidak masalah. Ya itu selalu menempatkan mereka yang terakhir. Itu sebabnya metode itu membutuhkan-t
.Opsi ini
-i
mengambil argumen opsional. Karena Anda memberi spasi setelahnya-i
, tidak ada argumen pada-i
opsi dan oleh karena itu yang berikutnya-0
bukan opsi untukxargs
tetapi yang kedua dari 6 operan{} -0 mv -t /some/path {}
.Dengan hanya opsi
-i
, xargs mengharapkan daftar nama file yang dipisahkan oleh baris baru. Karena mungkin tidak ada baris baru di input, xargs menerima apa yang tampak seperti nama file besar (dengan byte null tertanam, tetapi xargs tidak memeriksa itu). String tunggal ini yang berisi seluruh outputfind
lebih panjang dari panjang baris perintah maksimum, karenanya kesalahan "baris perintah terlalu panjang".Perintah Anda akan berfungsi
-i{}
sebagai gantinya-i {}
. Atau, Anda bisa menggunakan-I {}
:-I
mirip dengan-i
, tetapi mengambil argumen wajib, sehingga argumen berikutnya yang dilewatkan kexargs
digunakan sebagai argumen-I
opsi. Lalu argumen setelah itu-0
yang diartikan sebagai opsi, dan sebagainya.Namun, Anda tidak boleh menggunakannya
-I {}
sama sekali. Menggunakan-I
memiliki tiga efek:-I
mematikan pemrosesan penawaran, yang-0
sudah melakukannya.-I
mengubah string yang akan diganti, tetapi{}
merupakan nilai default.-I
menyebabkan perintah dieksekusi secara terpisah untuk setiap catatan input, yang tidak berguna di sini karena perintah Anda (mv -t
) secara khusus dimaksudkan untuk mengatasi beberapa file per permintaan.Entah jatuh
-I
dan-i
sekaligusatau jatuhkan xargs dan gunakan
-exec
:sumber
Coba gunakan bash untuk loop:
atau jika Anda ingin melihat apa yang terjadi:
sumber
Jika Anda melihat ini saat menggunakan kulit ikan .
Ini terkait dengan bagaimana ikan memperluas tali pengganti
{}
Jika Anda menggunakan ikan, Anda harus lolos dari string pengganti
\{\}
atau gunakan string pengganti yang berbeda
sumber