PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell Script



Lupus84
26.04.07, 22:19
Also ich bin noch ein blutiger Anfänger, aber arbeite mich langsam ein. Ich bearbeite gerade einige Shell-Script-Aufgaben ... und jetzt hätte ich gerne mal ein kurze und optimale Lösung zu folgender Aufgabe :
Ein Shell-Script, das die Dateien in einem Verzeichnis welches als Parameter übergeben wird löscht. Es sollen jeweils die Dateien gelöscht werden auf die am längsten nicht zugegriffen wurden. Wieviele Dateien gelöscht werden sollen, soll ebenfalls als Parameter übergeben werden.Zusätzlich soll eine Fehlermeldung ausgegeben werden wenn falsche Parameter übergeben worden sind.
Also, würde mich über Lösungsbeispiele freuen... :)

Der Gestreifte
27.04.07, 00:21
Weil das sehr nach Hausaufgabe aussieht:
"$1" ist der erste Parameter, der einem Skript übergeben wird, "$2" der zweite und so weiter.
Es gibt für "ls" Optionen, die nach atime sortieren.
"tail" in Verbindung mit "$2" ergibt die Dateien, die Du löschen willst.


Zusätzlich soll eine Fehlermeldung ausgegeben werden wenn falsche Parameter übergeben worden sind. Da tu ich mir ein bisschen hart, weil ich nicht weiß, was falsche Parameter sind.
Für $1 könnte es ein Verzeichnis sein, das nicht existiert oder gar keines ist (=> darauf testen).
Für $2 testen, ob es eine Zahl ist?

farion
27.04.07, 01:37
#!/bin/bash
IFS="
"
FAILURE=0
echo "";
if [ ! -d $1 ]; then
echo $1" is not a directory"
FAILURE=1
fi

case $2 in
*[0-9]*) ISINT=1;;
*) ISINT=0;;
esac

if [ ! $ISINT -eq 1 ]; then
echo $2" is not an integer"
FAILURE=1
fi

if [ $FAILURE -eq 0 ]; then
OLDDIR=`pwd`
cd $1
COUNTER=$2
declare -i COUNTER
for i in `ls -w 1 --sort=atime -r`; do
if [ -f $i ]; then
if [ ! $COUNTER == 0 ]; then
rm $i
((COUNTER--))
fi
fi
done
cd $OLDDIR
else
echo ""
echo "usage:"
echo $0" <dir> <int>"
fi

echo ""



Das geht aber nur für Dateien ohne Leerzeichen. Kann mir bei der Gelegenheit einer vielleicht erklären, wie das hier "for i in `ls -w 1`; do echo $i done" auch bei Dateien mit Leerzeichen funktioniert? Weil momentan würde das beispielsweise bei 3 fiktiven Dateien Folgendes ausgeben:

test.txt
langer
Dateiname
mit
Leerzeichen.txt
kurzerName.txt

Und das ist ja bei so einer Anwendung wie hier nicht unbedingt erwünscht.

Gruss farion

edit: IFS gesetzt

buzz768
27.04.07, 08:43
ls -t1 $1 | tail -n $2 | while read file ; do rm "$1/$file" ; done

Der Gestreifte
27.04.07, 12:30
Kann mir bei der Gelegenheit einer vielleicht erklären, wie das hier "for i in `ls -w 1`; do echo $i done" auch bei Dateien mit Leerzeichen funktioniert?Indem Du den IFS auf etwas geeignetes setzt.
maddin@captin:tmp2$ touch "datei mit leerzeichen"
maddin@captin:tmp2$ for i in `ls`; do echo "$i";done | grep le
leerzeichen
maddin@captin:tmp2$ IFS="
> "
maddin@captin:tmp2$ for i in `ls`; do echo "$i";done | grep le
datei mit leerzeichen

gnuroman
27.04.07, 12:55
... soll heißen schreib an den anfang deines scripts:


#!/bin/bash
IFS="
"

Gruß

farion
27.04.07, 13:16
wieder was gelernt.

Lupus84
29.04.07, 18:39
Danke für die Tipps und das Beispiel ! Hat mir weitergeholfen, wobei ich noch einiges verändert habe ... werde das Script nochmal posten ...

TheReaper
29.04.07, 20:40
Indem Du den IFS auf etwas geeignetes setzt.
maddin@captin:tmp2$ touch "datei mit leerzeichen"
maddin@captin:tmp2$ for i in `ls`; do echo "$i";done | grep le
leerzeichen
maddin@captin:tmp2$ IFS="
> "
maddin@captin:tmp2$ for i in `ls`; do echo "$i";done | grep le
datei mit leerzeichen
Für mich machen zwei simple Doppelhochkommas mehr Sinn, als ne Env-Variable zu ändern...

alt: for i in `ls`; do echo "$i";done
neu: for i in "`ls`"; do echo "$i";done

buzz768
29.04.07, 21:01
aber:


[user@linux tmp]$ for i in "`ls`"; do echo "$i";done
datei mit leerzeichen
noch eine datei mit leerzeichen
[user@linux tmp]$ for i in "`ls`"; do rm "$i";done
rm: Entfernen von »datei mit leerzeichen\nnoch eine datei mit leerzeichen« nicht möglich: Datei oder Verzeichnis nicht gefunden

gnuroman
18.05.07, 23:54
Für mich machen zwei simple Doppelhochkommas mehr Sinn, als ne Env-Variable zu ändern...

alt: for i in `ls`; do echo "$i";done
neu: for i in "`ls`"; do echo "$i";done
Außerdem ist es ******egal, da beim Aufruf eines Scripts in der bash immer eine eigene sub shell gestartet wird, mit anderen Worten, an den Environment Variablen ändert sich nix...