Unix'te belirli günlerden daha eski dosyalar nasıl bulunur ve silinir?


38

Günlük için 7 klasör içeren bir klasör var. Bu yedi klasörde de alt klasörleri var ve bu alt klasörlerin de alt klasörleri var. 15 günden daha eski olan tüm dosyaları, alt klasörler de dahil olmak üzere tüm klasörlerde yapıya dokunmadan silmek istiyorum, bu sadece dosyalar anlamına gelir.

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

Yanıtlar:


54

Söyleyerek başlayabilirsiniz find /var/dtpdev/tmp/ -type f -mtime +15. Bu, 15 günden daha eski olan tüm dosyaları bulur ve adlarını yazdırır. İsteğe bağlı olarak, -printkomutun sonunda belirtebilirsiniz , ancak bu varsayılan eylemdir. Hangi dosyaların seçildiğini görmek için ilk önce yukarıdaki komutu kullanmanız önerilir.

findKomutun silmek istediğiniz dosyaları listelediğini doğruladıktan sonra (ve başkalarını değil), dosyaları silmek için bir "eylem" ekleyebilirsiniz. Bunu yapmak için tipik eylemler şunlardır:

  1. -exec rm -f {} \;(ya da eşdeğer -exec rm -f {} ';')
    çalışır Bu rm -fher dosya ile; Örneğin,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    Bu rm -fseferde birçok dosya üzerinde çalışacak ; Örneğin,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    bu yüzden seçenek 1'den biraz daha hızlı olabilir. ( rm -fBinlerce dosyanız varsa, birkaç kez çalıştırmanız gerekebilir .)

  3. -delete
    Bu find, dosyaları çalıştırmadan silmeyi kendisine söyler rm. Bu, -execvaryantlardan sonsuz şekilde daha hızlı olabilir , ancak tüm sistemlerde çalışmayacaktır.

Yani, eğer seçenek 2'yi kullanırsanız, tüm komut şöyle olacaktır:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

-Delete kullanımı daha basittir (sözdizimi vardır ve silme işlemi yapmak için hiçbir alt işleme alınmaz) ancak tüm sistemlerde çalışmayabilir. rm -f {} + en iyisidir, bir komut satırı için çok fazla olması gereken dosyalar varsa, gruplar halinde dosyaları siler. rm -f {} ';' Bir komut satırı için çok fazla yeterli dosya varsa, komut çok uzun bir hata verecektir.
saat

-1

Veya bir döngü ile yapın:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

Bu, içinde boşluk bulunan dosyalarla çalışmaz.
Drav Sloan

Bunun yerine boşluk içeren dosyalara dikkat etmesi gereken bir while döngüsü kullanabilirsiniz. / var / dtpdev / tmp / -tipi f -snz +15 | x okunurken; rm "$ x"; bitti
David Okwii
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.