find - exec rm vs -delete

260

Saya mencoba memahami perbedaan antara dua perintah ini:

sudo find / -name .DS_Store -delete

dan

sudo find / -name ".DS_Store"  -exec rm {} \;

Saya perhatikan bahwa execmetode ini lebih disukai. Mengapa? Mana yang lebih aman / lebih cepat / lebih baik? Saya telah menggunakan keduanya pada Macbook saya dan semuanya tampak berfungsi dengan baik.

Bawang
sumber

Jawaban:

245

-delete akan tampil lebih baik karena tidak harus menelurkan proses eksternal untuk setiap file yang cocok.

Ada kemungkinan bahwa Anda mungkin melihat -exec rm {} \;sering direkomendasikan karena -deletetidak ada di semua versi find. Saya tidak dapat memeriksa sekarang, tetapi saya cukup yakin saya telah menggunakannya findtanpa itu.

Kedua metode harus "aman".

EDIT per komentar dari @doitmyway: pastikan Anda cocok dengan namanya dan kemudian hapus, bukan sebaliknya (hapus, lalu cocokkan). Kalau tidak, setiap file akan dihapus, apakah cocok atau tidak . Yaitu, JANGAN melakukan ini: find / -delete -name .DS_Store.

Metode umum untuk menghindari overhead pemijahan proses eksternal untuk setiap file yang cocok adalah:

find / -name .DS_Store -print0 | xargs -0 rm

(tetapi perhatikan bahwa ada masalah portabilitas di sini juga: tidak semua versi find miliki -print0!)

Celada
sumber
2
Saya melihat. Saya juga pernah membaca bahwa menggunakan -deletesaklar sebelum -namemenghapus pohon file yang ditentukan, jadi saya kira saya harus berhati-hati.
Bawang
8
Baru-baru ini findAnda dapat menggunakan -exec rm {} +untuk menghapus semua file yang cocok dengan rmperintah tunggal .
jimmij
3
.DS_Storesama sekali tidak mengandung karakter khusus, jadi tanda kutip tidak diperlukan dan tidak mengubah apa pun dalam hal ini.
Celada
1
Pada dasarnya hanya spasi putih (spasi, tab, mungkin yang lain) adalah satu-satunya hal yang menyebabkan string yang tidak dikutip ditafsirkan sebagai dua argumen baris perintah yang terpisah, tetapi itu tidak semua Anda harus minta maaf ketika memutuskan apakah akan mengutip atau tidak. Anda harus khawatir tentang semua karakter meta shell seperti ;atau |atau >atau <dan banyak lainnya yang memiliki arti khusus pada shell kecuali dikutip.
Celada
1
@MarcoMarsala xargsmenangani masalah daftar argumen ukuran terbatas secara transparan dengan memecahnya menjadi beberapa pemanggilan perintah.
Celada
27

Dengan asumsi .DS_Storemewakili file dan bukan direktori, cara yang paling portabel masih cepat untuk melakukannya adalah:

sudo find / -name .DS_Store -exec rm {} +

Satu-satunya risiko adalah sudotidak tersedia tetapi cukup rendah saat ini.

The -deletepilihan yang digunakan untuk menuntut GNU menemukan dan masih non standar di banyak lainnya findimplementasi, sehingga tidak selalu tersedia.

Pengakhiran perintah +bukannya \;sangat mengoptimalkan execklausa dengan tidak menjalankan rmperintah untuk setiap .DS_Storehadiah pada sistem file.

Jlliagre
sumber
16

Untuk mesin seperti macbook Anda, Anda tidak akan menemukan banyak perbedaan dalam kinerja antara kedua perintah. Namun, jika Anda melihat versi -exec Anda dapat melihat perbedaan yang halus:

sudo find / -iname ".file-to-delete"  -exec rm {} \;

Ini berarti Anda akan menemukan semua file tersebut dengan nama ".file-to-delete". Namun pencarian ini dapat mengembalikan beberapa positif palsu yang tidak diinginkan. Saat melakukan sesuatu dengan sudo Anda harus sedikit lebih berhati-hati. Keuntungan menggunakan -exec rm {} adalah Anda bisa meneruskan argumen ke rm seperti ini:

sudo find / -iname "*~"  -exec rm -i {} \;

Dalam contoh ini saya ingin menghapus file-file cadangan yang dibuat emacs. Namun tilde itu bisa berupa file yang tidak saya ketahui dan mungkin penting. Plus saya ingin mengkonfirmasi penghapusan. Jadi saya menempatkan opsi '-i' pada perintah rm. Ini akan memberi saya penghapusan interaktif.

Anda juga dapat mempersempit penggunaan rm untuk menghapus direktori serta file:

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

Secara singkat, -exec memberi Anda sedikit lebih banyak kontrol atas perintah aktual yang menghapus item yang ditemukan. Keuntungannya adalah Anda menggunakan satu alat untuk menemukan file, alat lain untuk menghapusnya. Juga tidak setiap versi utilitas find memiliki opsi -delete. Jadi lebih baik menggunakan setiap alat untuk pekerjaan yang semestinya. Ini adalah filosofi unix - satu alat, satu pekerjaan, gunakan bersama untuk melakukan apa yang perlu Anda lakukan.

Fr. John Jenkins
sumber
3
Lihat juga -ok rm {} \;di tempat -exec rm {} \;untuk konfirmasi interaktif.
Kusalananda