X günden daha eski dosyaları silin +


143

Bir klasörde 5 günden daha eski dosyaları silmek için komut buldum

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

Ancak bunu, bu klasördeki alt dizinler için nasıl yaparım?


Alt dizinlerin içindeki dosyaları mı kastediyorsunuz? veya alt dizinleri kendileri?
rahul

3
find /path/to -type d -empty -delete
Costas

2
Ayrıca 5+ günlük alt dizinlerdeki dosyaları silin
Teddy291

3
Boşluk içeren dosyalar olduğunda muhtemelen eğlenceli. Örneğin "bir test" denilen bir dosya ve rm besleniyor rm test one. (Bu "test" adlı bir dosyayı ve "bir" adlı bir dosyayı siler, ancak "test bir" adlı bir dosyayı silmez). İpucu: -delete or -print0
Hennes

6
Bir yan not olarak, her zamanfind cevabın ilk satırında belirtildiği gibi özel karakterlerle ilgili sorunlardan kaçınmak için verilen argümanı alıntılayın . Örneğin:find /path/to/files/ -exec somecommand '{}' \;
Walf

Yanıtlar:


240

Rm'ye bağlanırken özel dosya adlarına (boşluklar, tırnak işaretleri) dikkat edin.

Güvenli bir alternatif var - -delete seçeneği:

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

İşte bu, ayrı bir rm çağrısı yok ve dosya adları için endişelenmenize gerek yok.

Çalıştırmadan önce bu komutu test -deleteetmek -depth -printiçin ile değiştirin ( -deleteima eder -depth).


23
Ayrıca -type fyalnızca dosyaları silmek için kullanın (ve alt dizinleri de saklayın)
Oleg

3
Alternatif olarak, beş günden daha yeni olan tüm dosyalar için aynı işlemi yapmak istiyorsanız: find / path / to / directory / -mindepth 1 -mtime -5 -delete
zmonteca

Yolum boşluk içeriyorsa nasıl yapmalıyım? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio

3
@ uom-pgregorio Yolu tırnak içine almanızı öneririm.
atripes

4
Her findargümanın, önceki filtrenin sonucunu girdi olarak kullanan bir filtre olduğunu unutmayın . Bu yüzden -delete'yi son argüman olarak eklediğinizden emin olun. IE: find . -delete -mtime +5geçerli yoldaki HER ŞEYİ siler.
Johan

15

Çok fazla dosya bulduğunda bu komutun çalışmayacağını unutmayın. Bu gibi bir hata verecektir:

bash: /usr/bin/find: Argument list too long

Yani exec sistemi çağrısının bir komut satırının uzunluğu üzerindeki sınırı aşıldı. Bu şekilde rm çalıştırmak yerine, xargs kullanmak çok daha etkilidir . İşte işe yarayan bir örnek:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Bu, / root / Maildir / altında 14 günden daha uzun bir süre önce değiştirilmiş tüm dosyaları (f tipi) oradan ve daha derinden (mindepth 1) kaldırır. Daha fazla seçenek için bulma kılavuzuna bakın .


7
@ AfshinHamedi'nin AskUbuntu'daki cevabı ( askubuntu.com/questions/589210/removing-files-older-than-7-day ), yeni satırlar ve özel karakterler içeren dosyalara dikkat edin. Bunun yerine kullanımıfind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe

2
Veya sadece arama sonuçlarına '+' ekleyin
Dani_l

8

Aynısı. Sadece dosyaların öneki yerine üst dizini sağlamanız gerekir. Örneğinizde, şöyle olurdu:

find /path/to -type f -mtime +5 -exec rm {} \;

Bu, 5 günden daha eski olan tüm dosyaları /path/tove alt klasörlerini siler .

Boş alt dizinleri silmek için yukarıdaki @Costas yorumuna bakın.


4
Her dosya için rm komutunu çalıştıracağınıza dikkat edin. 5 günden daha eski 1000 dosyanız varsa, rm 1000 kez başlayacaktır. Bu nedenle -delete seçeneğini Costa'nın yorumundaki gibi veya -exec rm {} \ +
Hennes

@Hennes: - 1) +Bu durumda kaçman gerektiğinden emin değilsin . - 2) -exec rm '{}' +kendi adlarına özel karakterli (boşluklar, yeni satırlar vb.) Dosyaların kötülüğünü önlemek için yazmak daha iyi .
Cbhihe

-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
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.