Alt dizinlerle x günden eski dosyaları silmek için Bash komut dosyası


37

X günden daha eski bir ton dosyayı silmeye çalışıyorum.

Şimdi bunu yapmak için bir komut dosyası var

find /path/to/files* -mtime +10 -exec rm {} \; 

Ancak bu, alt dizinleri de siler. Tonlarca klasör var, ancak bunları saklamak ve dosyaları söz konusu klasörler içinde 10 günden daha eskiden silmek istiyorum.

Bunu yapmanın bir yolu var mı?

Yanıtlar:


50

type sonuçları filtreleme seçeneği

findtypeörneğin dosyaları seçme seçeneğini kabul eder .

find /path/to/files -type f -mtime +10 -delete

-deleteNe sileceğini göstermek için dışarıda bırakın ve bunu doğruladıktan sonra devam edin ve tam komutu çalıştırın.

Bu sadece dosyalarda çalışır, dizinleri değil. -type dYalnızca argümanlarınızla eşleşen dizinleri listelemek için tersini kullanın .


Ekstra seçenekler

man findGelecekte ihtiyaç duyabileceğiniz daha fazla seçenek olduğundan, okumak isteyebilirsiniz . Örneğin -maxdepth, bulunan öğeleri yalnızca belirli bir derinliğe sınırlamanıza izin verir, örneğin -maxdepth 0alt dizinlere tekrar girmez.

Bazı açıklamalar

  • Sadece bir klasörü kaldıramadığınız için komutun bir klasörü nasıl kaldırdığını merak ediyorum rm. Buna ihtiyacın rm -rolacak.

  • Ayrıca, /path/to/files*kafa karıştırıcı. Şunu mu demek istediniz /path/to/files/veya jokerin birkaç dosya ve klasör adına genişlemesini mi bekliyorsunuz?

  • Put {}tek tırnak içinde, yani '{}'biz ters eğik çizgi noktalı virgül korumak gibi, kabuk tarafından yorumlanmalıdır ikame dosya / dizin adı önlemek için.


Aslında / path / to / files / içinde pek çok klasör var. Aslında bu mtime +10 -exec rm komutunu bu klasörlerin hepsinde çalıştırmak istiyorum, ancak klasörlerin kendisini saklamak istiyorum, temelde elde etmek istediğim, tüm klasörleri silmek. dosyaları 10 günden eski ve tüm klasörleri saklar. Ben üzgünüm ama ben bu yeniliği :) :)
JoyIan Yee-Hernandez

Peki, işte gidiyoruz :) Sadece bir yap find /path/to/files* -type f -mtime +10ve çıktısını al.
slhck

Evet, şüphede olduğunda yapma -exec, sadece ilk önce ne bulduğunu gör.
Rob

2
@ JoyIanYee-Hernandez Ayrıca , tüm dosyaları ve klasörleri silen -deleteargümanını findancak boş olduğunda kullanabilirsiniz. Bu -depth, yani derinlik ilk arama anlamına gelir .
Daniel Beck

1
@Kreker Sonra -mindepth 1ana dizini dışlamak için eklemeniz gerekir .
slhck

5

Önceki cevaplarda olduğu gibi (her ikisi için de +1), püf nokta -type fyüklemeyi kullanmaktır .

Bunun yerine, yüklemeyi -exec rm '{}'de kullanabileceğinizi unutmayın -delete. Ama bunu yapma. İle -exec rm '{}'siz (ve olmalıdır) ilk yapabilirsiniz -exec echo rm '{}'bu istiyorsun gerçekten ne olduğunu doğrulamak için. Bundan sonra komutu olmadan yeniden çalıştırın echo.

Kullanımı -deletedaha hızlıdır (ekstra fork()ve execve()her dosya için değil), ancak bu risklidir, çünkü -deleteaynı zamanda bir koşul olarak da çalışır:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

ancak SADECE argümanları değiştirirseniz:

# delete ALL files
find . -type f -name '*.tmp' -delete

Tonlarca dosya için daha önce ihtiyacınız olursa findve rmdaha hızlı çalışmanız gerekiyorsa , find ... | xargs ... rmUNIX deyimini inceleyin.


4
Son iki örneğinizin tamamen aynı olduğunu düşünüyorum, bunu düzeltmek isteyebilirsiniz!
slhck

1

Bunu find komutuyla kolayca yapabilirsiniz

$ find -type f

Hangi sonuçların tür dosyasında olacağını kısıtlar


1

Özellikle dosya ve klasör adlarında yeni satırlar veya boşluklar varken, yukarıda verilen komut dosyalarını ve diğer bazı komut dosyalarını kullanarak bu hakkı elde etmek için mücadele ediyordum.

Sonunda tmpreaper tökezledi ve şimdiye kadar bizim için oldukça iyi çalıştı.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Orijinal Kaynak bağlantısı

Dizinleri tekrar tekrar kontrol eden ve listeleyen test gibi özelliklere sahiptir. Silme sırasında sembolik bağlantıları, dosyaları veya dizinleri ve ayrıca belirli bir düzen için koruma modunu silme özelliği


0

Komutu hızlandırmak için '+'yerine\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Bu, rmbir dosyanın bulunduğu her seferin sonunda yalnızca bir kez çalışır .
( rmkomut satırı uzunluğu sınırlaması nedeniyle gerçekten çok sayıda dosyanız varsa birkaç kez çalıştırılabilir, ancak bu neredeyse kullanmak kadar hızlıdır -delete)


0

rm -f find /path/to/files -type file -mtime -5

Bu, 5 gün içinde değiştirilen dosyaları siler

rm -f find /path/to/files -type file -mtime +5

Bu, 5 günden önce değiştirilen dosyaları siler

Bulmadan önce ve 5 sonra sonunda `kullanın.

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.