/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Bash script - fil dato'er
Fra : Michael Jenner


Dato : 07-08-03 14:42

Hej,

Jeg har brug for lidt bash-kode som kan finde ud af at rotere filer. Det
skal anvendes i forbindelse med nogle backup-jobs. Koden skal søge efter
filer med navne hvori der indgår et bestemt mønster:

<mønster>-<mere eller mindre tilfældigt>

Hvis der er mindre end X (variabel, f.eks. 10) filer der matcher
ovenstående skal det gøre noget bestemt, hvis der er 10 filer eller
flere skal sriptet slette de ældste således at de 9 nyeste er tilbage.
Et alternativ hvor man kun finder den ældste fil og sletter den er også
ok, men kun hvis man sikrer at der mindst er 9 efter sletning.

Datostemplerne fra op.sys. kan anvendes. Et alternativ er at bruge et
tidsstempel i filnavnet, men det er vist mere bøvlet at håndtere.

Tidsstemplet indeholder dag, måned og år. Jeg har overvejet om det også
skulle indeholde time, men pt. gør det ikke.

Jeg har overvejet noget i stil med:

find -name hejsa*txt | wc -l
find -name hejsa*txt -mtime +10 | wc -l

og udfra de to tal kan jeg bestemme om jeg må slette dem fra sidste
"find" kørsel, men det virker ikke specielt elegant.

Hvad med

ls -al -t hejsa*txt

?

Og hvordan limer jeg det hele sammen så jeg har et rigtigt bash script?
Jeg har forsøgt at starte:

#!/bin/sh
FILESMAX=10
FILEPATTERN=hejsa
FILEEXT=txt
FILEPATH=/afs/ies.auc.dk/user/mj/ osv

ls -al -t ${FILEPATH}${FILEPATTERN}*${FILEEXT}

Hints / scripts osv er meget velkomne,

På forhånd tak

Michael



 
 
sv-e (08-08-2003)
Kommentar
Fra : sv-e


Dato : 08-08-03 07:30

Hej
Prøv at se lidt på "find -mtime", inden du bruger for meget krudt på at
opfinde den dybe talerken


/sv-e

Michael Jenner (08-08-2003)
Kommentar
Fra : Michael Jenner


Dato : 08-08-03 08:47

sv-e wrote:
> Hej
> Prøv at se lidt på "find -mtime", inden du bruger for meget krudt på at
> opfinde den dybe talerken
>
>
> /sv-e

Jamen den kender jeg godt - og den var også inkluderet i mit første
indlæg

"find -mtime n" alene løser ikke problemet, da den kun finder antallet
af matchende filer som højest er n dage gamle. Jeg har brug for at vide
om der ligger 10 filer i forvejen, hvis der gør ønsker jeg at slette den
ældste. Hvis der ikke ligger 10 filer i forvejen vil jeg ikke slette
nogen, kun tilføje en ny.

Mvh Michael



Morten (08-08-2003)
Kommentar
Fra : Morten


Dato : 08-08-03 09:08

Michael Jenner wrote:

> sv-e wrote:
>
>> Hej
>> Prøv at se lidt på "find -mtime", inden du bruger for meget krudt på at
>> opfinde den dybe talerken
>>
>>
>> /sv-e
>
>
> Jamen den kender jeg godt - og den var også inkluderet i mit første
> indlæg
>
> "find -mtime n" alene løser ikke problemet, da den kun finder antallet
> af matchende filer som højest er n dage gamle. Jeg har brug for at vide
> om der ligger 10 filer i forvejen, hvis der gør ønsker jeg at slette den
> ældste. Hvis der ikke ligger 10 filer i forvejen vil jeg ikke slette
> nogen, kun tilføje en ny.
>
> Mvh Michael
>
>

Hvad med noget a la:

max=9
count=`ls pattern*stuff|wc -l`

while [ $count -gt $max ]
do
oldfile=`ls -t pattern*stuff|tail -1`
rm $oldfile
count=`ls pattern*stuff|wc -l`
done

Morten



Michael Jenner (08-08-2003)
Kommentar
Fra : Michael Jenner


Dato : 08-08-03 10:23

Morten wrote:
> Hvad med noget a la:
>
> max=9
> count=`ls pattern*stuff|wc -l`
>
> while [ $count -gt $max ]
> do
> oldfile=`ls -t pattern*stuff|tail -1`
> rm $oldfile
> count=`ls pattern*stuff|wc -l`
> done
>
> Morten
>
>

Jeps ... det var lige "tail -1" jeg manglede ... tak!

Men hvis rm af en eller anden grund ikke virker så går scriptet i en
uendelig løkke.

Michael


Morten (08-08-2003)
Kommentar
Fra : Morten


Dato : 08-08-03 10:31


> Men hvis rm af en eller anden grund ikke virker så går scriptet i en
> uendelig løkke.

Så se på exit code fra rm :)

rm $oldfile > /dev/null 2>1
if [ $? -neq 0 ]; then
echo "Failed to delete $oldfile"
exit 1
fi

Morten


sv-e (08-08-2003)
Kommentar
Fra : sv-e


Dato : 08-08-03 09:10

Hej
Beklager jeg var så useriøs, ikke at læse dit problem ordentligt igennem.
Her følger en lille seance som du kan udføre med test eller []:

<eksempel>
#!/bin/sh
export path=/home/sem/tests
export files_num=`ls $path|wc -l`
if [ "$files_num" -gt "10" ]
then
echo "Der er over 10 filer"
else
echo "Der er under 10 filer"
fi
</eksempel>

Du skal så bare indsætte dine værdier/kommandoer, vær opmærksom på at linien
som finder antal filer "files_num", ikke tager højde for at der kan være
underbiblioteker i tests dir.



Kan du komme videre herfra ?

/sv-e



Michael Jenner (08-08-2003)
Kommentar
Fra : Michael Jenner


Dato : 08-08-03 10:32

sv-e wrote:
> Her følger en lille seance som du kan udføre med test eller []:

Fint,

> Kan du komme videre herfra ?

Det hjælper.

Jeg har postet nuværende udgave af scriptet (se denne tråd), men vil
gerne undgå at ligge filnavn i array FNAME. Hvordan bruger jeg tail til
at hente sidste element fra FILENAMES?

Er det muligt at "pipe" eller lignende FILENAMES f.eks. over i en tail?
Og derved hente sidste element

echo ${FILENAMES} | tail -1

virker ikke,

Mvh Michael


Michael Jenner (08-08-2003)
Kommentar
Fra : Michael Jenner


Dato : 08-08-03 10:07

Her er et bud. Scriptet kan sikkert gøres meget pænere ...

#!/bin/bash
FILEMAX=10
FILEPATTERN="hejsa"
FILEEXT="txt"
FILEPATH="/home/mj osv ..."

FILENAMES=`ls -al -t ${FILEPATH}${FILEPATTERN}*${FILEEXT} | awk '{ print
$9 }'`

NUMFILES=0
declare -a FNAME
for i in $FILENAMES; do
let NUMFILES=$NUMFILES+1
FNAME[${NUMFILES}]=$i
done

# Find the oldest file:
OLDFILE=${FNAME[${NUMFILES}]}
echo "Name of the oldest file: ${OLDFILE}"

if [ ${NUMFILES} -lt ${FILEMAX} ];
then
echo "There are fewer files than FILEMAX"
echo "No files are deleted!"
else
echo "There are FILEMAX or more files matching"
echo "The following file will be deleted: ${OLDFILE}"
fi



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste