shell script fråga... timestamp

Tråden skapades och har fått 9 svar. Det senaste inlägget skrevs .
1

Vad jag behöver göra är att ta bort filer från ett directory, alla de filer som är äldre än 10 dagar.
Filerna heter: .040712_1034, .040711_1032, .040710_923 etc etc
Det kommer fyra nya om dagen, vilket gör att jag vill rensa bort de äldsta.

Min första idé var att läsa in unix timestamp i en variabel ta det minus 86400 sedan köra det genom date för att få ut datumet så jag vet vilka jag kan ta bort.
Problem 1 jag fick var att jag inte kunde få fram UNIX timestamp.
Problem 2 jag vet inte hur jag löser av en fillista och jämför det med en variabel.

Jag ber nog om rätt mycket nu. Jag hade hackat ihop detta i php på 2 min men nu ska det göras i bash shell script och då blir det något helt annat.

wire hjälper du mig?

Senast redigerat 2004-07-14 08:37

glömsk?

Jag skrev en liten snabbis i Perl. Den är förhoppningsvis pedagogisk (men inte så effektiv som den kan vara).

#!/usr/bin/perl

$dir = "/Users/yourhome";

opendir(DIR, $dir) || die "Can't open $dir: $!";
my @files = grep { $_ ne '.' and $_ ne '..' } readdir DIR; # Ta inte med . eller ..
closedir DIR;

# Sortera äldsta filer först
foreach (sort {-M qq($dir/$b) <=> -M qq($dir/$a)} @files) {
   
  $age = -M $_;        # Hur många dagar sedan filen modifierades?   
  if($age>10) {
    print("File $_ is $age days old...\n");
  }

}

Bara byt ut utskriften mot

unlink "$_" || die "Can't remove file $_";

när du vill köra med skriptet skarpt.

Ciryon

  • Medlem
  • International user
  • 2004-07-13 22:49
# Ställ dig i rätt mapp
cd /din/mapp/med/filer

# Hitta filer äldre än 10-dagar (modification-date)
find . -maxdepth 1 -type f \! -newermt '10 days ago' -name "[0-9]*[0-9]\.TXT" > tmp_hittade

# För varje hittad fil (som finns i filen 'tmp_hittade')gör...
for filen in `cat tmp_hittade`
do
               rm -f ./"$filen"
done

'find'-raden:
Listar filer (-type f) där du står (. -maxdepth 1) äldre än 10 dagar (\! -newermt '10 days ago') vars namn matchar regex (-name "[0-9]*[0-9]\.TXT") till en fil (> tmp_hittade)

Senast redigerat 2004-07-14 08:10
  • Medlem
  • Stockholm
  • 2004-07-14 02:11

precis, använd find och sen så får du lära dig att ställa hela frågor istället för bara delfrågor så kan du få vettiga svar från mig också. =D

/glemme

Glömsk - javisst.
Tack Ciryon och Wire.

Hörredu glemme, nu ska vi vara snälla här. Vid det här laget borde du ha lärt dig att jag sällan ställer hela frågan innan jag verkligen kört fast.

Fasen snart kan jag söka jobb som Sys admin på nåt UNIX företag. *hehe*

Oj var på väg att ställa en dum fråga till som tur var vaknade hjärnan så jag såg hur jag kunde utnyttja wires script på ett annat sätt.
Men ändå inte...

Nu vill jag något annat.
I en mapp landar dessa filer:
TB040710.TXT
TB040711.TXT
TB040712.TXT

De landar där strax efter 00.00 varje dygn. Namnet de får är från dagen innan då backupen skapar detta dokument. Varje dag kl 01.00 vill jag kopiera det senaste skapade dokumentet till en annan plats.
Hur ska jag skriva ihop find kommandot nu?

find . -maxdepth 1 -name "TB[0-9]*[0-9]\.TXT" -newermt '1 day ago'

Det hade varit så enkelt om jag kunde mixtrat med unix timestamp och sedan byggt ihop namnet eftersom jag vet namnet men måste skapa det dynamiskt. Inser direkt att perl kommer jag alrig få tid att lära mig, trist.

Senast redigerat 2004-07-14 09:01
  • Medlem
  • International user
  • 2004-07-14 09:30

Bygg filnamnet så här

#!/bin/sh
filnamnet=TB$(date -r $((`date +%s`-86400)) +%y%m%d)\.TXT
echo $filnamnet

Ahhh date i sekunder!
Det jag ville ha. Tack!

1
Bevaka tråden