Automatyczne usuwanie plików starszych niż 7 dni


17

Jestem kompletnym noobem w Linuksie, ale zaczynam rozumieć. Mam Ubuntu Server 16.04 z serwerem FTP do tworzenia kopii zapasowych plików bezpieczeństwa. Pliki zostaną zapisane w folderach, takich jak: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3i tak dalej.

Pamiętaj, że każdy securityfolderNjest innym użytkownikiem.

Ponieważ nie chcę, aby moje dyski twarde były cały czas zapełnione, chcę codziennie usuwać w tych folderach pliki starsze niż 7 dni.


/homezazwyczaj zawiera podfolder dla każdego użytkownika. Jeśli nie chcesz przechowywać kopii zapasowych jako różnych użytkowników (niezbyt dobry pomysł), powinieneś rozważyć inną lokalizację, np. /home/security/backup1I tak dalej.
Melebius

@Melebius dziękuję za komentarz, każdy / securityfolder jest innym użytkownikiem, zapomniałem o tym wspomnieć.
Jacco van de Wijgaart,

Odpowiedzi:


28

Po pierwsze, to polecenie znajdzie i usunie wszystkie pliki starsze niż 7 dni w dowolnym podkatalogu, /homektórego nazwa zaczyna się od securityuser:

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

Potrzebujesz, -mtime +6a nie +7dlatego, że -mtimeliczy 24-godzinne okresy. Jak wyjaśniono w -atimeczęści man find( -mtimedziała w ten sam sposób):

   -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.

Tak więc, aby znaleźć plik, który został zmodyfikowany 7 lub więcej dni temu, musisz znaleźć pliki, które zostały zmodyfikowane ponad 6 dni temu -mtime +6.

Następnym krokiem jest uruchomienie tego polecenia raz dziennie. Ponieważ każdy securityuserNjest innym użytkownikiem (być może zechcesz przemyśleć tę konfigurację, wszystko komplikuje się), należy to uruchomić jako root. Więc edytuj /etc/crontab:

sudo nano /etc/crontab

I dodaj tę linię:

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

Spowoduje to uruchomienie findpolecenia raz dziennie i usunięcie plików.


+1 Wbicie gwoździa nieco głębiej i być może powtórzenie sugestii Melebiusa dla OP, że find '/home/securityuser/*' -mtime +6 -type f -delete(przy wszystkich istotnych i odpowiednich zmianach w tworzeniu użytkowników) może być ogólnie lepszym pomysłem niż find '/home/securityuser*' -mtime +6 -type f -delete(bez cięcia na ścieżce) ...?
Cbhihe

@Cbhihe nie, wywoływane są katalogi docelowe /home/securityuserN, więc bez ukośnika nie można ich znaleźć.
terdon

tak, widziałem to; po prostu nie uważałem, że to dobra praktyka ze strony OP (tworzenie osobnego użytkownika dla każdego filmu bezpieczeństwa itp.) zgodnie z pierwszym komentarzem Melebiusa, nawet jeśli OP może mieć ku temu powody. Jeśli cokolwiek, mój komentarz był kiepski, a nie krytyka dobrej i pełnej odpowiedzi.
Cbhihe

1
+1 ode mnie Zwróć uwagę na jeden szczegół, kiedy działałem na RHEL: symbol wieloznaczny nie działał na ścieżce. Musiałem umieścić to na -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis

1
@SteliosAdamantidis o wow, całkowicie mi tego brakowało! Tak, oryginalna wersja nie działałaby, ponieważ cytowałem 'securityuser*'. Symbol wieloznaczny powinien być rozwinięty przez powłokę, a nie przez find, więc powinien być securityuser*(bez cudzysłowów). Zobacz zaktualizowaną odpowiedź. Dzięki za zwrócenie uwagi, Stelio, nie mogę uwierzyć, że nikt wcześniej tego nie zauważył! Ti vlakas!
terdon

4

zgodnie z moją wiedzą:

spróbuj wykonać następujące findpolecenie:

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

Dziękuję za Twoją odpowiedź. Czy ./dirc/* oznacza: ./home/securityfolder1/* czy to źle?
Jacco van de Wijgaart,

Właśnie wypróbowałem to w moim virtualboxie find /home/jacco/ -mtime +1 -type f -deletei wydaje się, że działa. Jak mogę to zautomatyzować?
Jacco van de Wijgaart,

utwórz jeden plik skryptu i uruchom tę komendę, używając skryptu, jeśli działa, niż uruchom plik skryptu podczas uruchamiania.
Maulik Patel,

jestem jak supernoob tutaj, ponieważ jest to część tworzenia skryptu, czy to oznacza plik #!/bin/bashi kod pod nim? czy naprawdę jestem tutaj głupi?
Jacco van de Wijgaart,

2
@ Melebius nie, ścieżka nie powinna być cytowana, szczególnie jeśli zawiera znaki glob. Ty chcesz to zostać rozszerzona przez powłokę i cytuje będzie blokować to. Spróbuj na przykład: find '/u*' -name local. Takie dyrektywy -name "foo*"powinny być cytowane, gdy zawierają znaki globalne.
terdon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.