7 günden eski dosyaları otomatik sil


17

Ben linux tam bir çaylağım ama asmak başlıyorum. Güvenlik video dosyalarını yedeklemek için bir FTP sunucusu çalıştıran bir Ubuntu Server 16.04'üm var. Dosyaları gibi klasörlerde saklanır: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3vb.

Her birinin securityfolderNfarklı bir kullanıcı olduğunu unutmayın .

Sabit disklerimin her zaman dolu olmasını istemediğimden, bu klasörlerde günlük olarak 7 günden eski dosyaları silmek istiyorum.


/homegenellikle her kullanıcı için bir alt klasör içerir. Yedeklemelerinizi farklı kullanıcılar olarak saklamak istemiyorsanız (gerçekten iyi bir fikir değil), başka bir konum, örneğin /home/security/backup1, vb.
Melebius

@Melebius yorumunuz için teşekkür ederim, her / güvenlik klasörü farklı bir kullanıcı, bundan bahsetmeyi unuttum.
Jacco van de Wijgaart

Yanıtlar:


28

İlk olarak, bu komut /home, adı ile başlayan herhangi bir alt dizinde 7 günden eski tüm dosyaları bulur ve siler securityuser:

find /home/securityuser* -mtime +6 -type f -delete

İhtiyacınız var -mtime +6, +7çünkü değil -mtime24 saatlik periyotları sayar. -atimeBölümünde açıklandığı gibi man find( -mtimeaynı şekilde çalışır):

   -atime n
          File  was  last  accessed n*24 hours ago.  When find figures out
          how many 24-hour periods ago the file  was  last  accessed,  any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

Bu nedenle, 7 veya daha fazla gün önce değiştirilmiş bir dosyayı bulmak için, 6 günden daha önce değiştirilmiş dosyaları bulmanız gerekir -mtime +6.

Bir sonraki adım, bu komutun günde bir kez çalıştırılmasıdır. Her securityuserNbiri farklı bir kullanıcı olduğundan (bu kurulumu yeniden düşünmek isteyebilirsiniz, her şeyi daha karmaşık hale getirir), bu root olarak çalıştırılmalıdır. Yani, düzenle /etc/crontab:

sudo nano /etc/crontab

Ve bu satırı ekleyin:

@daily root find /home/securityuser* -mtime +6 -type f -delete

Bu, findkomutu günde bir kez çalıştırır ve dosyaları siler.


+1 Çiviyi biraz daha derine sürmek ve belki de Melebius'un OP'ye önerisini yinelemek, find '/home/securityuser/*' -mtime +6 -type f -delete(kullanıcı yaratılışındaki tüm ilgili ve uygun değişikliklerle) genellikle find '/home/securityuser*' -mtime +6 -type f -delete(yolda eğik çizgi olmamasından) daha iyi bir fikir olabilir ...?
Cbhihe

@Cbhihe hayır, hedef dizinler çağrılır /home/securityuserN, bu yüzden eğik çizgi olmadan bulunamazlar.
terdon

evet, gördüm; OP'nin bunu yapmak için nedenleri olsa da, Melebius'un ilk yorumu doğrultusunda OP'nin (her güvenlik videosu için ayrı bir kullanıcı, vb.) iyi bir uygulama olduğunu düşünmüyordu. Benim yorumum topal bir şey olsaydı, yr iyi ve eksiksiz bir cevap değil.
Cbhihe

1
+1 Benden. Bunu RHEL'de çalıştırırken bir ayrıntıya dikkat edin: joker karakter yolda çalışmadı. Onu koymak zorunda kaldım -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis

1
@SteliosAdamantidis oh vay, bunu tamamen özledim! Evet, alıntı yaptığımdan beri orijinal sürüm çalışmaz 'securityuser*'. Joker karakter, kabuk tarafından değil, genişletilmelidir find, bu nedenle securityuser*(tırnak işaretleri olmadan) olması gerekirdi . Güncellenmiş cevaba bakınız. İşaret ettiğin için teşekkürler Stelio, daha önce kimsenin fark etmediğine inanamıyorum! Ti vlakas!
terdon

4

benim bilgime göre:

findkomutu şöyle deneyin :

find ./dirc/* -mtime +6 -type f -delete

./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm

Cevabınız için teşekkür ederim. ./Dirc/* şu anlama gelir: ./home/securityfolder1/* veya bu yanlış mı?
Jacco van de Wijgaart

Sadece sanal kutumda denedim find /home/jacco/ -mtime +1 -type f -deleteve işe yarıyor gibi görünüyor. Bunu nasıl otomatikleştirebilirim?
Jacco van de Wijgaart

bir komut dosyası oluşturun ve komut dosyası dosyanızı başlatma işleminde çalıştırmak yerine, komut dosyası kullanarak bu komutu çalıştırın.
Maulik Patel

Ben burada supernoob gibiyim, çünkü script yapmanın bir parçası, bu bir dosya #!/bin/bashve altındaki kod anlamına mı geliyor? yoksa tam burada mı aptal mıyım?
Jacco van de Wijgaart

2
@Melebius hayır, özellikle glob karakterleri içeren bir yol belirtilmemelidir. Sen istiyorsun o kabuk tarafından genişletilmiş olması ve bu engelleyeceğini alıntı. Örneğin, deneyin: find '/u*' -name local. -name "foo*"Glob karakterleri içerdiğinde bunun gibi talimatlar alıntılanmalıdır.
terdon
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.