Shellscript hjälp

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

Är novis på shellscript. Har en MacOS X Server (10.3) med en "slask" volym där användare tillfälligt lägger filer. Filerna ska sedan kastas. Detta sker nästan aldrig utan jag får göra jobbet åt dom. Skulle vilja ha ett script som automatiskt tar bort filer som är äldre än 30 dagar på slaskvolymen. Hur gör jag? Har aldrig scriptat men lär mig gärna. Upplys mig

1: Gör ett script som tar bort de aktuella filerna i mappen tex:

#!/bin/sh
rm -rf /Volumes/Katalog/*

spara detta enkla script som en fil, tex staeda.sh.
Sätt rätt rättigheter på scriptet:

chmod +x staeda.sh

Flytta scriptet till nånstans där det kan exekveras, tex /usr/bin/

mv staeda.sh /usr/bin

2: Lägg till scriptet i crontab så att det körs en gång varje månad.

export VISUAL=pico

Detta byter crontab-editor till pico, som är aningens lättare att arbeta med än "vi" som är standard.

editera crontab:

crontab -e root

här i lägger du till följande rad:

0 1 1 * * /usr/bin/staeda.sh 1> /dev/null

avsluta editorn med ctrl-x och svara Y på frågan om att spara.

Efter detta skall scriptet köras 01.00 första dagen vaja månad.

  • Medlem
  • International user
  • 2004-08-11 23:13
#!/bin/sh

# Temporär fil med hittade filer
tmp_hittade="/tmp/hittade.$$"

# Här söker vi i
cd /Volumes/Volymen

# filer äldre än 30-dagar "modification-date"
find . -type f \! -newermt '30 days ago' > $tmp_hittade

# För varje hittad fil gör vad du vill...
for filename in `cat $tmp_hittade`
do
        # radera eller vad du vill...
done

# Städa upp i 'tmp'
rm -f $tmp_hittade
Ursprungligen av Wire:
#!/bin/sh

# Temporär fil med hittade filer
tmp_hittade="/tmp/hittade.$$"

# Här söker vi i
cd /Volumes/Volymen

# filer äldre än 30-dagar "modification-date"
find . -type f \! -newermt '30 days ago' > $tmp_hittade

# För varje hittad fil gör vad du vill...
for filename in `cat $tmp_hittade`
do
        # radera eller vad du vill...
done

# Städa upp i 'tmp'
rm -f $tmp_hittade

Det går också att åstadkomma samma sak utan att behöva ta till tempfiler, då kan man banta skriptet till en enda rad:

find /Volumes/slaskvolymen -type f -mtime +30 -print0 | xargs -0 rm -f

Tar man bort "-type f" så rensas även kataloger, symlänkar och annat som inte är vanliga filer (f:et betyder att bara vanliga filer listas).

Går självklart bra att lägga in kommandot i crontab-filen direkt utan att behöva spara ett separat shellscript nånstans, då ser det ut så här:

0  1  *  *  *  find /Volumes/slaskvolymen -type f -mtime +30 -print0 | xargs -0 rm -f > /dev/null 2>&1

Observera att jag ändrade crontab-raden till att köras varje dag (och då klockan 01:00); körs det bara en gång i månaden kommer en del filer inte att rensas förrän de är ca. 60 dagar gamla (d.v.s. två månader minus en dag).

Ursprungligen av Samuel K:
find /Volumes/slaskvolymen -type f -mtime +30 -print0 | xargs -0 rm -f

Om inte jag minns fel så går del väl även att använda parametern -delete på find.

find /Volumes/slaskvolymen -type f -mtime +30 -print0 -delete

/JD

Bugar och bockar

För de snabba gensvaren. Ska testa under morgondagen. Återkommer om jag skulle stöta på patrull.

Ursprungligen av rudeboy:

Om inte jag minns fel så går del väl även att använda parametern -delete på find.

find /Volumes/slaskvolymen -type f -mtime +30 -print0 -delete

/JD

Stämmer, men det kan i vissa fall ge problem eftersom raderingen då sker mitt under pågående traversering (se sektionen "bugs" i find-manualen). Kör du i stället via xargs raderas inga filer förrän traverseringen är färdig. Påstås också att det går snabbare den vägen, men jag har aldrig bemödat mig om att kolla sanningshalten i det påståendet.

Ursprungligen av Samuel K:

Stämmer, men det kan i vissa fall ge problem eftersom raderingen då sker mitt under pågående traversering (se sektionen "bugs" i find-manualen). Kör du i stället via xargs raderas inga filer förrän traverseringen är färdig. Påstås också att det går snabbare den vägen, men jag har aldrig bemödat mig om att kolla sanningshalten i det påståendet.

Ah, det visste jag inte. Alltid bra att veta.

/JD

  • Medlem
  • Sollentuna
  • 2004-08-12 23:16

Tips för hackare som vill prova sina script - har ni inte gamla filer så behöver ni inte vänta
i 30 dar, använd 'touch'

Typ:

# touch -t 20040628095500 foo

se 'man touch'

Ursprungligen av Samuel K:

Observera att jag ändrade crontab-raden till att köras varje dag (och då klockan 01:00); körs det bara en gång i månaden kommer en del filer inte att rensas förrän de är ca. 60 dagar gamla (d.v.s. två månader minus en dag).

Dum fråga för er kanske men hur lägger jag till raden i Crontab?

Ursprungligen av Arch@ngel:

Dum fråga för er kanske men hur lägger jag till raden i Crontab?

Hittade programmet Cronnix som verkar vara gjort för mig Däremot så händer inget när jag lägger in kommandot nedan. När man manuellt väljer att köra kommandot i Cronnix händer följande:

Running command
find /Users/katalog/katalog/katalog -type f -mtime +30 -print0 | xargs -0 rm -f > /dev/null 2>&1
The output will appear below when the command has finished executing

Vad kan vara fel?. Scriptet rensar inte katalogen.

Ursprungligen av Samuel K:

Det går också att åstadkomma samma sak utan att behöva ta till tempfiler, då kan man banta skriptet till en enda rad:

find /Volumes/slaskvolymen -type f -mtime +30 -print0 | xargs -0 rm -f

Tar man bort "-type f" så rensas även kataloger, symlänkar och annat som inte är vanliga filer (f:et betyder att bara vanliga filer listas).

Går självklart bra att lägga in kommandot i crontab-filen direkt utan att behöva spara ett separat shellscript nånstans, då ser det ut så här:

0  1  *  *  *  find /Volumes/slaskvolymen -type f -mtime +30 -print0 | xargs -0 rm -f > /dev/null 2>&1

Observera att jag ändrade crontab-raden till att köras varje dag (och då klockan 01:00); körs det bara en gång i månaden kommer en del filer inte att rensas förrän de är ca. 60 dagar gamla (d.v.s. två månader minus en dag).

Jag fick det nu nästan att fungera. Scriptet tar bort alla filer och vissa kataloger. Det blir kvar vissa kataloger där det blir ändrad "modifikation date" samtidigt som scriptet kastar innehållet i katalogen. Då kommer ju inte scriptet att rensa dessa tomma kataloger förrän om 30 dagar. Varför?

  • Medlem
  • Sollentuna
  • 2004-08-13 16:53
Ursprungligen av Arch@ngel:

Jag fick det nu nästan att fungera. Scriptet tar bort alla filer och vissa kataloger. Det blir kvar vissa kataloger där det blir ändrad "modifikation date" samtidigt som scriptet kastar innehållet i katalogen. Då kommer ju inte scriptet att rensa dessa tomma kataloger förrän om 30 dagar. Varför?

Tar du bort en fil modifieras katalogen den fanns i...

Hur ser scriptet ut nu?
Använder du 'rm' lär inte katalogerna försvinna, måste väl använda 'rm -r' i så fall
eller 'rmdir'.

Kanske ditt script behöver hålla koll på att om alla filer i en katalog är gamla så skall
den ta bort hela katalogen.
Eller om du kan vänta en månad så rensar du tomma/gamla kataloger med:

0 1 * * * find /Volumes/slaskvolymen -type d -mtime +30 -print0 | xargs -0 rmdir > /dev/null 2>&1

(ej provat)

Ursprungligen av Arch@ngel:

Jag fick det nu nästan att fungera. Scriptet tar bort alla filer och vissa kataloger. Det blir kvar vissa kataloger där det blir ändrad "modifikation date" samtidigt som scriptet kastar innehållet i katalogen. Då kommer ju inte scriptet att rensa dessa tomma kataloger förrän om 30 dagar. Varför?

Ta bara bort "-type f" och ändra kommandot som xargs kör till "rm -rf" i stället för "rm -f". Kör du rm utan parametern "-r" tas nämligen inga kataloger bort, bara filer. Glömde bara säga det...

Ursprungligen av Samuel K:

Ta bara bort "-type f" och ändra kommandot som xargs kör till "rm -rf" i stället för "rm -f". Kör du rm utan parametern "-r" tas nämligen inga kataloger bort, bara filer. Glömde bara säga det...

Nu fungerar nästan allt. Scriptet tar dock ej bort .app och .pkg filer. De jag har i katalogen är med ändringsdatum 2002 och 2003. Tackar för all hjälp jag fått med denna tråd. Man tackar.

hrm.. nu blev de iof lite fel i mitt lilla script när ja läste igenom detta ovan, men sno en rad från wire om "30 days" o de så blir de nog bra

du får inte output ifrån kommandot eftersom du skickar det till /dev/null (dvs ut i tomheten mer eller mindre). att det inte rensar, kan bero på att inga filer är äldre än 30dagar?

Ursprungligen av johan dansk:

du får inte output ifrån kommandot eftersom du skickar det till /dev/null (dvs ut i tomheten mer eller mindre). att det inte rensar, kan bero på att inga filer är äldre än 30dagar?

Jag har 152 filer/kataloger där ca 135 är äldre än 30 dagar enligt "ändringsdatum" , tyvärr.

  • Medlem
  • 2004-08-12 14:44

Kan det vara så att user:n som kör scriptet inte har behörighet att ta bort filerna?
(Klassiskt UNIX-problem...)

  • Medlem
  • International user
  • 2004-08-12 15:18

Skriv ett riktigt shellscript istället. Och logga varje hittad fil/försök att ta bort den. Normalt lägger man aldrig komandon i crontab.

Ursprungligen av Wire:

Skriv ett riktigt shellscript istället. Och logga varje hittad fil/försök att ta bort den. Normalt lägger man aldrig komandon i crontab.

Kan jag inte hålla med om. Det finns ingen anledning att skapa separata shellscript för triviala enradskommandon, det enda som händer är IMHO att man bara tillför fler moment (och möjliga felkällor).

haha, med all respekt; det var något av det dummaste jag har hört
samma som att säga att det är generalfel att skriva "one-liners" när man sitter i prompten; "Nä, glöm all vad heter piping och sånt, här måste man gör utförliga shellscripts till varenda sak man vill göra"

I unix finns det ju åttahundrafemtioelva lösningar på ett visst problem, och att kalla något sådant för nybörjarfel tycker jag är lite väl magstärkt..

- johan, onelining crontab since '97

  • Medlem
  • Sollentuna
  • 2004-08-16 20:02
Ursprungligen av johan dansk:

haha, med all respekt; det var något av det dummaste jag har hört
samma som att säga att det är generalfel att skriva "one-liners" när man sitter i prompten; "Nä, glöm all vad heter piping och sånt, här måste man gör utförliga shellscripts till varenda sak man vill göra"

I unix finns det ju åttahundrafemtioelva lösningar på ett visst problem, och att kalla något sådant för nybörjarfel tycker jag är lite väl magstärkt..

- johan, onelining crontab since '97

Öh, va?

Ursprungligen av flabb:

Öh, va?

Du för diskussionen vidare, konstruktivt.

1
Bevaka tråden