2012-11-21 13 views
82

Jestem nowy w skryptach powłoki, czy ktoś może pomóc? Chcę usunąć skrypty w folderze z bieżącej daty z powrotem do 10 dni. Skrypty wygląda następująco:Usuwanie plików starszych niż 10 dni przy użyciu skryptu powłoki w systemie Unix

2012.11.21.09_33_52.script 
2012.11.21.09_33_56.script 
2012.11.21.09_33_59.script 

Skrypt będzie działał w każdym 10 dniu z Crontab, dlatego muszę bieżącą datę.

+0

skończyłeś wys ave spójrz na 'man date'? – Jens

+3

Czy chcesz usunąć na podstawie nazwy pliku lub czasu modyfikacji pliku? – Barmar

+0

Potrzebuję całego skryptu :) znajduję exapmle, ale nie jestem pewien, czy to jest dobre dla tego: find/home/scripts /. -name '* .script' -mtime +10 -exec rm -rf '{}' \; – Steve88

Odpowiedz

283

find jest powszechnym narzędziem do tego rodzaju zadania:

find ./my_dir -mtime +10 -type f -delete 

OBJASNIENIA

  • ./my_dir Twój katalog (zamień na ith własne)
  • -mtime +10 starsze niż 10 dni
  • -type f tylko pliki
  • -delete nie dziwi. Usuń go przetestować filtr find przed wykonaniem całe polecenie

i dbać że ./my_dir istnieje, aby uniknąć złych niespodzianek!

+0

'find /home/scripts/*.script -mtime +10 typ f -delete' będzie ok do usunięcia tych? 2012.11.21.09_33_52.script 2012.11.21.09_33_56.script 2012.11.21.09_33_59.script – Steve88

+0

To zależy od daty modyfikacji, jak co 'ls wyświetla -l'. Czy data jest taka sama jak "ls -l"?Ale prosty test powie Ci:) –

+0

tak, to jest data kreacji skryptu – Steve88

4

Jeśli możesz sobie pozwolić na pracę za pośrednictwem danych plików, można zrobić

find -mmin +14400 -delete 
+1

Do [anonimowego edytora] (http://stackoverflow.com/review/suggested-edits/5805137): Której wersji 'find' ma opcję' -rm-rf'? – glglgl

11

Wystarczy przypraw się skrypt powłoki, aby usunąć starsze pliki

#!/bin/bash 

timestamp=$(date +%Y%m%d_%H%M%S) 
path="/data/backuplog" 
filename=log_back_$timestamp.txt 
log=$path/$filename 

find $path -name "*.txt" -type f -mtime +7 -print -delete >> $log 

echo "Backup:: Script Start -- $(date +%Y%m%d_%H%M)" >> $log 

START_TIME=$(date +%s) 

... code for backup ...or any other operation .... 


END_TIME=$(date +%s) 

ELAPSED_TIME=$(expr $END_TIME - $START_TIME) 


echo "Backup :: Script End -- $(date +%Y%m%d_%H%M)" >> $log 
echo "Elapsed Time :: $(date -d 00:00:$ELAPSED_TIME +%Hh:%Mm:%Ss) " >> $log 

Build kod na odpowiedź Sputnick i dodaje jeszcze kilka rzeczy.

  • pliki dziennika o nazwie ze znacznikiem czasu
  • folderu
  • dziennika określonym
  • find szuka plików * .txt tylko w folderze dziennika
  • pliki dziennika starsze niż 7 dni są usuwane (zakładając, że jest to dla dziennika kopia zapasowa)
  • odnotowuje czas rozpoczęcia/zakończenia
  • oblicza czas, który upłynął ...
+0

Witam @ MarcoZen. Mam 2 komendy 'find' i' delete' zapisujące do tego samego '$ log'. Dlaczego tworzy trzy pliki dziennika, z których dwa pierwsze nie zawierają żadnej zawartości, a ostatni plik ma usuniętą listę plików. Co mogę zrobić, aby polecenie znajdowania i usuwania nie generowało wielu plików? –

+0

@FokwaBest - Czy mógłbyś utworzyć inny plik dziennika? bcos znacznika czasu? Czy w pełni używasz powyższego kodu? Możesz mi pomóc w pastebin? – MarcoZen

+0

Witam @ MarcoZen, musiałem usunąć '_% H% M% S'. W przypadku małych plików wygenerowano tylko jeden plik dziennika, ale gdy rozmiar plików do usunięcia jest duży, wygenerowano wiele plików dziennika z różnymi '_% H% M% S'. Po usunięciu tej części wszystko jest zapisane w jednym pliku. –

Powiązane problemy