N günden eski dizinleri silmek için kabuk betiği


165

Ben şu şekilde adlandırılan dizinleri var:

2012-12-12
2012-10-12
2012-08-08

Bir bash kabuk betiği ile 10 günden eski dizinleri nasıl silebilirim?


1
Gerçek yaratma / değiştirme süreleriyle herhangi bir ilişkiye sahipler mi? Çünkü findo zaman isme bakmadan yapabilirdi ...
Wrikken

onlar da yaratma / değiştirme zamanları olmalı
bobsr

4
Ne demek "daha büyük" demek? Dizinin yaratıldığı zamandan, içeriğinin en son değiştirildiği zamandan veya başka bir şeyden mi bahsediyorsunuz? Aşağıdaki cevaplardan bazılarına dikkat edin; ctimeinode değiştirme zamanıdır. Bir dizin için, dosyalar dizine eklendiğinde veya dizinden kaldırıldığında değişir.
ajk

Yanıtlar:


391

Bu sizin için tekrar tekrar yapacaktır:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;

Açıklama:

  • find: dosyaları / dizinleri / bağlantıları bulmak için kullanılan unix komutu
  • /path/to/base/dir: aramanızı başlatmak istediğiniz dizin.
  • -type d: sadece dizinleri bul
  • -ctime +10: sadece değişiklik süresi 10 günden eski olanları düşünün
  • -exec ... \;: bulunan her bir sonuç için aşağıdaki komutu ...
  • rm -rf {}: özyineli olarak dizini kaldırmaya zorla; {}Bul sonuç, önceki kısmından sübstitüe alır burada bir parçasıdır.

Alternatif olarak şunları kullanın:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf

Bu biraz daha verimlidir, çünkü şu anlama gelir:

rm -rf dir1 dir2 dir3 ...

aksine:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

-execyöntemde olduğu gibi .


Modern versiyonları ile find, sen yerini alabilir ;ile +ve eşdeğer yapacak xargsher exec sistem çağrı üzerine sığacak sayıda dosyaları olarak geçen, sizin için çağrı:

find . -type d -ctime +10 -exec rm -rf {} +

13
-mtimeizin değişikliklerinden ziyade içerik değişikliklerini kontrol ettiğim için benim için daha iyiydi, aksi takdirde mükemmeldi.
quickshiftin

7
Bence bu da temel dir kendini siler
ya da Gal

3
@OrGal kesinlikle haklısın. Bunu önlemek amacıyla, sadece kullanın: find /path/to/base/dir/*.
zloynemec

11
dizinlerin içeriğini yoksaymak için -maxdepth 1 kullanabilirsiniz
Sam

7
Silinecek çok fazla klasörünüz varsa daha verimli yaklaşım geri tepebilir: stackoverflow.com/questions/11289551/… . Aynı nedenden dolayı, temel klasörün silinmesini önlemek için -mindepth 1(daha ziyade /path/to/folder/*) kullanmak daha iyidir .
Ohad Schneider

41

/path/to/baseÖrneğin altındaki tüm alt dizinleri silmek istiyorsanız ,

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3

ancak kök silmek istemiyorum /path/to/base, eklemek zorunda -mindepth 1ve -maxdepth 1altında sadece alt dizinleri erişecek olan seçenekleri/path/to/base

-mindepth 1kökü /path/to/baseeşleşmelerden hariç tutar .

-maxdepth 1olacak SADECE hemen altında alt dizinleri maç /path/to/basegibi /path/to/base/dir1, /path/to/base/dir2ve /path/to/base/dir3ama olacak değil özyinelemeli şekilde bu listesi alt dizinleri. Dolayısıyla, bu örnek alt dizinler listelenmeyecektir:

/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1

ve benzerleri.

Bu nedenle, altında /path/to/base10 günden eski olan tüm alt dizinleri silmek için ;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf

20

find-deleteoperasyonu destekler , bu yüzden:

find /base/dir/* -ctime +10 -delete;

Bence dosyaların da 10+ gün daha eski olması gerekiyor. Denemedim, birisi yorumlarda onaylayabilir.

Burada en çok oy alan çözüm eksik -maxdepth 0olduğundan rm -rfsildikten sonra her alt dizini çağırır . Bu mantıklı değil, bu yüzden şunu öneririm:

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} \;

Yukarıdaki -deleteçözüm kullanılmaz -maxdepth 0çünkü finddir boş değil şikayet ediyorum. Bunun yerine, -depthaşağıdan yukarıya doğru ima eder ve siler.


-deleteİşleri onaylayabilirim , ancak dediğin gibi, sadece boş dizinleri silmek için kullanabilirsiniz rmdir.
CTodea

3

Özellikle dosya ve klasör adlarında satır başı veya boşluk olduğunda yukarıda verilen komut dosyalarını ve diğer bazı komut dosyalarını kullanarak bu hakkı elde etmek için uğraşıyordum.

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

tmpreaper -t 5d ~/Downloads


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

Orjinal kaynak bağlantısı

Dizinleri yinelemeli olarak kontrol eden ve listeleyen test gibi özelliklere sahiptir. Silinirken sembolik bağlantıları, dosyaları veya dizinleri ve ayrıca belirli bir desen için koruma modunu silme özelliği


2

VEYA

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

Güncellenmiş, daha hızlı sürümü:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f

2
Bu, maksimum komut satırı uzunluğunu kolayca aşabilir. Bkz xargs --show-limits.
Michael Krupp

2
Ayrıca boşluk veya diğer özel kabuk karakterleri içeren dosya adları varsa da çalışmaz.
Martin Tournoij

@Carpetsmoker Özel kabuk karakterlerine dikkat etmiyor -print0/ -0ilgilenmiyor mu, hayır mı?
mpen

O haklısın xargsversiyonu @mpen, ancak ilk satırı olmaz.
Martin Tournoij
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.