Dosyaları ve dizinleri adlarına göre silin. Böyle bir dosya ya da dizin yok


32

Derlenmiş tüm verileri silmem gerekiyor:

  • denilen rehberler build,
  • denilen rehberler obj,
  • * .so dosyaları.

Komut yazdım

find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;

Bu, tüm dizinleri yinelemeli olarak geçirir ve ihtiyacım olanı siler.

Sonunda neden böyle bir çıktı var? Belki farklı bir komut yazmalıyım.

find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory

hangi sistemdesin her zaman findböyle kullanmalısın find /search_directory options, arama dizinini çıkarmamak iyi bir fikir değildir
Kiwy

Bunun gibi otomatik silme kötü bir fikirdir. Senaryo size adaylar verebilir, bu da sistem için önemli veya gerekli herhangi bir şeyi silmemeniz için dikkat etmeniz gereken bir şeydir. Bunu nerede çalıştırdığın belli değil. Bunu yalnızca bir kullanıcı alanında yapıyorsanız, çok fazla zarar vermeyeceğini varsayalım, ancak bunu yanlışlıkla bir sistem alanında yapmadığınızdan emin olmalısınız. Kesinlikle böyle bir betiği kullanıcı olarak çalıştırmak istiyorsunuz.
Faheem Mitha

@ Kiwy, @ FaheemMitha, komut yalnızca proje müdürlüğünde kullanılacaktır; orada hiçbir zararı olmaz.
Maksim Dmitriev

Yanıtlar:


54

İçinde -prunebulunan finddosyaları bulmaya çalışırken uğraşmamak için yine de sileceğiniz dizinleri kullanın :

find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +

Ayrıca *.so, aksi belirtilmedikçe, kabuk tarafından .sogeçerli dizindeki dosyaların listesine genişletilebileceğini de unutmayın .

GNU- -regextipinizden birinin karşılığı :

find . \( -name build -o -name obj -o -name '*?.so' \) -prune -exec rm -rf {} +

GNU’ya özel bir sözdizimi kullanacaksanız, -deletebunun yerine iyi kullanabileceğinizi unutmayın -exec rm -rf {} +. İle -delete, GNU findyanar -depthotomatik. Harici komutları çalıştırmaz, bu şekilde daha verimlidir ve aynı zamanda, bir dizini zaman içindeki bir sembolik bağlantıya değiştirerek birisinin sizi yanlış dosyaları çıkartabileceği yarış koşulunu ortadan kaldırması nedeniyle daha güvenlidir. findbir dosya bulur ve rmkaldırır ( info -f find -n 'Security Considerations for find'ayrıntılar için).

find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete

-deleteayrıca boşluklar gibi şeyleri daha iyi ele alıyor
Izkata

@ Izkata, onlardan daha -exec rm -rf {} +da önemli olmayan bir şey değil.
Stéphane Chazelas

@StephaneChazelas - Kafam karıştı {}- alıntı mı yapılmalı mı yoksa yapılmamalı mı? Tırnaksız çalışıyor gibi görünüyor, ancak GNU Findutils Manual'{}' örnekte kullanıyor . Lütfen açıklığa kavuşturur musunuz?
grebneke

1
@grebneke, çok eski sürümlerinde alıntı yapılması gerekebileceğini iddia eden bir yer olduğunu düşünüyorum cshancak bu talebi doğrulayamadım. Bildiğim hiçbir modern kabuğa ihtiyaç duymuyorlar. POSIX tarafından kesinlikle gerekli değiller. POSIX örnekler bunları kullanmayın.
Stéphane Chazelas

3
Ve -deletedizinlerle kullanılamaz.
St0rM

8

Bunun nedeni, findilk önce dizin ağacını silen ve açıkça en iyi sırada olmayan dizin içeriğini denetlemeye çalıştığıdır. Önce findiçeriği kontrol etmeye zorlayabilirsiniz :

find . -depth ...

-deleteDosyalar ve -exec rmdirdizinler için kullanmayı düşünmelisiniz .


0

Çözümüm.

find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -prune -exec rm -rf {} +

+ vs \; -exec komutunda


Bu her zaman işe yaramayacaktır, yalnızca silinmiş bir dizinde yürütmeler arasında bir sınır olmazsa.
Gilles 'SO- kötü olmayı bırak'

@Gilles, "infazlar arasındaki sınır" ne demek?
Maksim Dmitriev

1
-exec … {} +Bir seferde birden fazla dosya için komutu, komut satırına sığdığı kadar yürütür. Çok fazla dosya varsa (veya yolların toplam uzunluğu çok uzunsa daha kesin bir şekilde), findbirden çok örneğini yürütecektir rmve bu nedenle, geçtiği bir dizini silmeye son verebilir. Sadece ile +olduğundan daha az olası ;, ancak +sorunu çözmez.
Gilles 'SO- kötülükten
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.