Sintaksnya adalah:
find ... -exec cmd {} +
find
akan menemukan sejumlah file berdasarkan kriteria di ...
dan dijalankan cmd
dengan daftar jalur file sebagai argumen, sebanyak mungkin tanpa melampaui batas pada ukuran argumen ke perintah.
Jika perlu dapat membagi daftar file dan memanggil cmd
beberapa kali. Misalnya, ini mungkin berakhir dengan panggilan:
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
Keterbatasan dengan itu adalah yang {}
terakhir. Misalnya, Anda tidak dapat menulis:
find ... -exec cmd {} other args +
seperti yang Anda bisa dengan ';'
bukan '+'
.
Kamu bisa menulis:
find ... -exec echo foo {} +
tapi tidak:
find ... -exec echo {} foo +
Jadi, jika Anda perlu menambahkan beberapa argumen tambahan cmd
setelah daftar file, Anda harus menggunakan shell. (Alasan lain mengapa Anda perlu memanggil shell adalah kapan saja Anda perlu menggunakan fitur shell seperti pengalihan, pipa, beberapa ekspansi string ....)
Dalam sh -c 'inline-script' x a b c
, untuk inline-script
, $0
adalah x
, $1
adalah a
, $2
adalah b
... demikian "$@"
juga daftar 3 argumen: a, b dan c. Jadi di:
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
Untuk skrip inline , $0
(yang digunakan misalnya saat menampilkan pesan kesalahan) diatur ke find-sh
dan "$@"
merupakan daftar file (apa yang find
diperluas {}
ke).
Dengan menggunakan exec
builtin khusus dari shell:
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
Kami memberi tahu shell untuk tidak melakukan proses tambahan untuk menjalankan cmd
, tetapi sebaliknya menjalankannya dalam proses yang sama (mengganti proses shell yang berjalan dengan perintah itu). Beberapa shell suka bash
, zsh
dan beberapa implementasi ksh
melakukannya secara implisit untuk perintah terakhir dalam sebuah skrip.
-exec sh -c '(cmd1; cmd2;)' find-sh {} +
?find-sh {}
argumen apa yang ada pada perintah sh -c '...', kan?find
akan memanggil/bin/sh
dengan sebagai argumen("sh", "-c", "...", "find-sh", "./file1", "./file2"...). And inside
..., that maps (the shells maps that) to
$ 0` makhluk"find-sh"
, dan parameter posisi ($1
,$2
... yang bisa dibilang adalah argumen untuk naskah inline ) menjadi./file1
,./file2
.