bulmak - exec rm vs -delete


260

Bu iki komut arasındaki farkı anlamaya çalışıyorum:

sudo find / -name .DS_Store -delete

ve

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

execYöntemin tercih edildiğini fark ettim . Neden? Hangisi daha güvenli / daha hızlı / daha iyi? İkisini de Macbook'umda kullandım ve her şey iyi çalışıyor gibi görünüyor.

Yanıtlar:


245

-delete Daha iyi performans gösterecektir çünkü eşleşen her dosya için harici bir süreç oluşturmak zorunda değildir.

Tüm sürümlerinde bulunmadığından -exec rm {} \;sıkça önerilenleri görebilirsiniz . Şu anda kontrol edemiyorum, ancak onsuz kullandığımdan eminim .-deletefindfind

Her iki yöntem de "güvenli" olmalıdır.

@Doitmyway adresinden yorum başına DÜZENLE : adla eşlediğinizden emin olun ve sonra tersini yapın (silin, eşleştirin). Aksi takdirde , eşleşip eşleşmediği her dosya silinir . Yani, YAPMAYIN bunu: find / -delete -name .DS_Store.

Eşleştirilen her dosya için harici bir işlem oluşturmanın ek yükünü önlemenin yaygın bir yöntemi:

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

(ama burada da bir taşınabilirlik sorunu olduğunu unutmayın: Bulmanın tüm sürümlerinde yoktur -print0!)


2
Anlıyorum. Ayrıca -deleteanahtarı -namebelirtilen dosya ağacını silmeden önce kullandığımı da okudum , bu yüzden dikkatli olmalıyım.
Soğan

8
Son zamanlarda tüm eşleşen dosyaları tek komutla kaldırmak findiçin kullanabilirsiniz . -exec rm {} +rm
jimmij

3
.DS_Storehiç özel karakter içermez, bu yüzden tırnaklar gereksizdir ve bu durumda hiçbir şeyi değiştirmez.
Celada

1
Temel olarak sadece boşluk (sekmeler, sekmeler, belki diğerleri), tırnaksız bir dizgenin iki ayrı komut satırı argümanı olarak yorumlanmasına neden olan tek şeydir, ancak alıntı yapıp yapmamaya karar verirken üzülmeniz gereken tek şey bu değil. Veya veya veya veya ve `` gibi tüm kabuk meta karakterleri ve alıntı olmadıkça kabuk için özel bir anlamı olan diğerleri hakkında endişelenmeniz gerekir. ;|><
Celada

1
@MarcoMarsala xargs, sınırlı boyut argüman listesi problemini şeffaf bir şekilde komutun çoklu çağrılarına bölerek halleder.
Celada

27

.DS_StoreDizinleri değil dosyaları temsil ettiğini varsayarsak , bunu yapmanın en hızlı ve en portatif yolu şöyle olacaktır:

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

Tek risk, sudokullanılamaması ama bugünlerde oldukça düşük.

-deleteSeçenek GNU bulmak ve diğer pek çok olmayan standart hala talep kullanılan findbu yüzden her zaman mevcut değildir, uygulamaları.

Komut sonlandırma +yerine , dosya sistemindeki her bir hediye için komutu çalıştırmayarak yan tümce \;en iyi duruma getirir .execrm.DS_Store


16

MacBook'unuz gibi bir makine için iki komut arasındaki performansta çok fazla fark bulamazsınız. Ancak, -exec versiyonuna bakarsanız, ince bir fark görebilirsiniz:

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

Bu, tüm bu dosyaları ".file-to-delete" ismiyle bulacağınız anlamına gelir. Bununla birlikte, bu arama bazı istenmeyen yanlış pozitifler getirebilir. Su ile bir şey yaparken biraz daha dikkatli olmalısın. -Exec rm {} kullanmanın avantajı, rm'ye benzer argümanları geçebilmenizdir:

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

Bu örnekte, emacs'ın yaptığı yedekleme dosyalarını kaldırmak istiyorum. Bununla birlikte, bu bilmediğim, bilmediğim ve önemli olabileceğim gizli bir dosyada olabilir. Artı silmeyi onaylamak istiyorum. Bu yüzden '-i' seçeneğini rm komutuna koydum. Bu bana etkileşimli bir silme verecektir.

Ayrıca, dosyaların yanı sıra dizinleri silmek için rm kullanımını daraltabilirsiniz:

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

Kısacası, -exec, bulunan öğeyi silen gerçek komut üzerinde size biraz daha kontrol sağlar. Bunun avantajı, dosyaları bulmak için bir aracı, bunları kaldırmak için başka bir aracı kullanmanızdır. Ayrıca find yardımcı programının her sürümünde -delete seçeneği yoktur. Her bir aleti kendi uygun işi için kullanmak çok daha iyi. Bu unix felsefesidir - bir araç, bir iş, yapmanız gerekenleri yapmak için bunları birlikte kullanın.


3
Etkileşimli onay için bunun -ok rm {} \;yerine de bakın -exec rm {} \;.
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.