Apa perbedaan antara menggunakan '+' (plus) dan ';' (titik koma) dalam perintah -exec?

28

Saya ingin tahu bahwa apa perbedaan antara menggunakan +dan ;pada akhir -execperintah ketika saya menggunakan dalam findperintah?

find .... -exec ... \; 

VS

find .... -exec ... + 
αғsнιη
sumber

Jawaban:

36

-exec ... \;akan menjalankan satu item demi satu. Jadi jika Anda memiliki tiga file, baris exec akan berjalan tiga kali.

-exec ... {} +adalah untuk perintah yang dapat mengambil lebih dari satu file sekaligus (mis cat. stat, ls). File yang ditemukan oleh finddirantai bersama seperti xargsperintah. Ini berarti lebih sedikit forking out dan untuk operasi kecil, dapat berarti peningkatan yang substansial.

Berikut ini adalah demo kinerja yang menghasilkan 10.000 file kosong.

$ mkdir testdir
$ touch testdir/{0000..9999}

$ time find testdir/ -type f -exec cat {} \;
real    0m8.622s
user    0m0.452s
sys     0m8.288s

$ time find testdir/ -type f -exec cat {} +
real    0m0.052s
user    0m0.015s
sys     0m0.037s

Sekali lagi ini hanya bekerja pada perintah yang dapat mengambil banyak nama file. Anda dapat bekerja jika perintah Anda seperti itu dengan melihat halaman manualnya. Berikut sinopsis dari man cat:

SYNOPSIS
       cat [OPTION]... [FILE]...

Ellipsis aktif [FILE]...berarti dapat mengambil lebih dari satu file.

+hanya dapat digunakan pada perintah tunggal dan Anda harus memiliki tepat satu {}di baris. \;dapat beroperasi dengan beberapa grup zero-to-many.

Oli
sumber
4
Contoh: dengan \;, perintah yang dieksekusi adalah cat 1; cat 2; cat 3. Dengan +, perintah yang dieksekusi adalah cat 1 2 3.
Alaa Ali
AFAIK, +ini bukan POSIX, jadi mungkin tidak tersedia pada sistem non-Linux. Bukan masalah jika Anda tidak pernah meninggalkan platform, tetapi senang mengetahui jika Anda harus menggunakan Solaris. :)
Simon Richter
Oh bagus, terima kasih atas informasinya. Saya biasanya -exec <command> {} ';'karena lebih mudah pada pengetikan saya (saya bisa menyentuh tipe tapi saya tidak punya teknik terbaik).
hanetzer
2
@SimonRichter: Tidak, -exec ... {} +adalah POSIX. Lihat: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm
@SimonRichter -exec ... {} +Ekstensi tersebut disarankan untuk dimasukkan ke dalam spesifikasi POSIX pada tahun 2001 dan diratifikasi menjadi edisi POSIX 6 pada tahun 2004. Kemungkinan versi Solaris yang Anda gunakan lebih tua dari standar POSIX (atau hanya menargetkan versi sebelumnya).
Oli