[bash] directory uitlezen en in array plaatsen

Pagina: 1
Acties:

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 07:34

Kaastosti

Vrolijkheid alom!

Topicstarter
Misschien dat ik een verkeerde methode gebruik om mijn doel te bereiken, daarom even uitleg wat ik probeer te doen. Ik ben bezig met m'n allereerste bash scriptje, welke een nieuwe config download, de huidige backupped en daarna de nieuwe over de oude heen zet. Dit stukje werkt prima en daar ben ik trots op ;)

Het begint leuk te worden op het moment dat ik niet altijd maar backups wil blijven bewaren, maar bijvoorbeeld slechts 5 entries. Mijn idee is dus om dat script de /backup dit uit te laten lezen, gesorteerd op datum (ls -lt werkt daar goed voor), daarvan de meer recente 5 bewaar en op de rest van de bestanden een simpele doch doeltreffende 'rm <file>' uit te voeren.

Zoals gezegd is dit m'n eerste poging en gaat m'n kennis van scripting in linux nog niet zo gek ver, maar ik heb geen recht-toe-recht-aan manier kunnen vinden om de inhoud van een directory gesorteerd in een array te krijgen. Het resultaat wat ik wil krijgen is ongeveer zoiets:
$array[0]['filename'] = 'foo'
$array[0]['date'] = '21-03-2004'

$array[1]['filename'] = 'bar'
$array[1]['date'] = '22-03-2004'

Het verdere sorteren, selecteren en verwijderen moet ik wel uit gaan komen met de search en Google, alleen het eenmaal in een array krijgen is wat pittig :) Of is een dergelijke actie zelfs met 1 shell commando uit te voeren?

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
for file in `ls -ltr <filename*> |tail -n 5`
do
mv $file /tmp/keep/
done
rm <filename*>
mv /tmp/keep/* .

Je pakt de 5 laatste files , moved die naar een tmp dir, delete de rest en moved de files terug

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:05

Robtimus

me Robtimus no like you

u_nix_we_all schreef op dinsdag 19 april 2005 @ 13:24:
for file in `ls -ltr <filename*> |tail -n 5`
do
mv $file /tmp/keep/
done
rm <filename*>
mv /tmp/keep/* .

Je pakt de 5 laatste files , moved die naar een tmp dir, delete de rest en moved de files terug
Of je doet het direct:
COUNT=`ls -ltr <filename*> | wc -l`
for file in `ls -ltr <filename*> | head -n (($COUNT -5))
do
rm $file
done

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 07:34

Kaastosti

Vrolijkheid alom!

Topicstarter
Da's inderdaad ook een idee :) Gewoon even uit de weg zetten wat je nodig hebt en de rest weggooien. Ik voerde net bovenstaand script uit, maar gaf bij de rm niet op waar dan dingen verwijderd moesten worden. Gevolg: weg script :| Het is nog even puzzelen met rechten, maar het idee is goed.
Of je doet het direct:
COUNT=`ls -ltr <filename*> | wc -l`
for file in `ls -ltr <filename*> | head -n (($COUNT -5))
do
rm $file
done
Da's nog sneller inderdaad... en minder moeilijkheden met het aanmaken en verwijderen van directories enzo :)

Hmm alleen dat gedeelte (($COUNT -5)) is op geen manier goed te krijgen. Op de een of andere manier wordt dat "10-5" en dat is een ingeldig aantal regels. Het wordt niet van elkaar afgetrokken in ieder geval.

[ Voor 52% gewijzigd door Kaastosti op 19-04-2005 14:11 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
je kunt met let iets doen:

let COUNT=$COUNT-5

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 07:34

Kaastosti

Vrolijkheid alom!

Topicstarter
Ah inderdaad, dat werkt wel. Hij verwijderd bestanden volgens plan, alleen krijg ik alsnog wel een hele berg foutmeldingen over me heen "No such file or directory". Die 'for file' statement.. is $file dan een array?

Het probleem komt volgens mij doordat die $file een lijstje met gegevens is van ieder bestand. Als hij de bestandsnaam tegenkomt verwijderd hij deze, aangezien die gewoon gevonden kan worden. De rest van de gegevens echter:
-rw-r--r--
1
root
root
0
2005-04-19
15:25

zijn niet te vinden als bestand in die dir, dus daarop krijg ik een foutmelding.

[ Voor 49% gewijzigd door Kaastosti op 19-04-2005 14:36 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
u_nix_we_all schreef op dinsdag 19 april 2005 @ 13:24:
for file in `ls -ltr <filename*> |tail -n 5`

<snip>
Jah, da's een foutje, maak daarvan maar "ls -tr <filename*>
dus niet in long format ;P

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 07:34

Kaastosti

Vrolijkheid alom!

Topicstarter
Doh die had ik zelf kunnen verzinnen :|
Hij werkt :D dit zijn leuke dingen om te kunnen zeg...

[ Voor 42% gewijzigd door Kaastosti op 19-04-2005 14:51 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.

Pagina: 1