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.
-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!)
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.
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:
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:
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.
-delete
saklar sebelum-name
menghapus pohon file yang ditentukan, jadi saya kira saya harus berhati-hati.find
Anda dapat menggunakan-exec rm {} +
untuk menghapus semua file yang cocok denganrm
perintah tunggal ..DS_Store
sama sekali tidak mengandung karakter khusus, jadi tanda kutip tidak diperlukan dan tidak mengubah apa pun dalam hal ini.;
atau|
atau>
atau<
dan banyak lainnya yang memiliki arti khusus pada shell kecuali dikutip.xargs
menangani masalah daftar argumen ukuran terbatas secara transparan dengan memecahnya menjadi beberapa pemanggilan perintah.Dengan asumsi
.DS_Store
mewakili file dan bukan direktori, cara yang paling portabel masih cepat untuk melakukannya adalah:Satu-satunya risiko adalah
sudo
tidak tersedia tetapi cukup rendah saat ini.The
-delete
pilihan yang digunakan untuk menuntut GNU menemukan dan masih non standar di banyak lainnyafind
implementasi, sehingga tidak selalu tersedia.Pengakhiran perintah
+
bukannya\;
sangat mengoptimalkanexec
klausa dengan tidak menjalankanrm
perintah untuk setiap.DS_Store
hadiah pada sistem file.sumber
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:
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:
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:
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.
sumber
-ok rm {} \;
di tempat-exec rm {} \;
untuk konfirmasi interaktif.