Usuwam pliki starsze niż 1 miesiąc, ale zostawiaj pliki utworzone pierwszego dnia miesiąca

2

Próbuję usunąć niektóre pliki archiwów z folderu na serwerze plików CentOS za pomocą usługi cronjob. Wymagania:

  1. Usuń pliki z ostatniego miesiąca
  2. Plik .tgz pierwszego dnia miesiąca należy pozostawić nietknięty.

Wiem, że mogę usunąć pliki starsze niż x dni za pomocą:

find /path -mtime +30 -exec rm {} \;

Nie pozostawi to jednak samego archiwum utworzonego pierwszego dnia miesiąca. Wydaje się, że Internet nie zapewnia (jeszcze) odpowiedzi.

Robert
źródło
Czy twoje pliki są nazwane po dacie, jak np. log-2013-02-27.tgzI takie? W takim przypadku możesz uruchomić touch *-01.tgzprzed findpoleceniem. Wszystkie pliki z pierwszego każdego miesiąca należy zaktualizować do bieżącego znacznika czasu, a tym samym nie dopasować.
Daniel Andersson
Nie użyjesz +29zamiast +30zrobić?
terdon
Jak o find /path -mtime +30 ! -name log-2013-02-01.tgz -exec rm {} \;?
Scott

Odpowiedzi:

3

Najpierw notatka

W systemach plików unix nie masz informacji o czasie utworzenia pliku. To, co często nazywane jest ctime, to czas zmiany statusu pliku. Można to zmienić przez zmianę nazwy pliku lub zmiany uprawnień.

Zobacz ten link, aby uzyskać więcej informacji.

Ostrzegamy, że poniższe rozwiązanie może zawieść.

Rozwiązanie za pomocą awk

findnie ma operatora do wybierania specjalnej daty. Zatem sztuczka polega na utworzeniu wyniku z dniem miesiąca i nazwą pliku oraz za pomocą separatora, który nie jest częścią nazw plików. Zakładam, że #to taki możliwy znak separatora.

 find . -mtime +30 -printf "%Cd#%p\n"

W drugim kroku możesz odfiltrować niechciane pliki.

 find . -mtime +30 -printf '%Cd#%p\n' |awk -F'#' '$1 !~ /^01/{print $2;}'

Rozwiązanie za pomocą grepicut

Wykonanie tej samej sztuczki, co powyżej.

 find . -mtime +30 -printf '%Cd#%p\n' |grep -v '^01' |cut -d '#' -f 2

źródło