Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell Script
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?
#!/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
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
... soll heißen schreib an den anfang deines scripts:
#!/bin/bash
IFS="
"
Gruß
Danke für die Tipps und das Beispiel ! Hat mir weitergeholfen, wobei ich noch einiges verändert habe ... werde das Script nochmal posten ...
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
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
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...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.