PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell Anfänger haben großes Problem



cpunktK
29-04-2008, 10:18
Hallo
Ich programmiere noch nicht so lange Shell Skripte wie einige von euch.
Achso bevor ichs vergesse, ich nutze die Shell unter Suse 10.3 das ist die bash
Habe erst kürzlich in der Schule damit angefangen. Habe da bei einer Aufgabe ein Problem.
Aufgabenstellung lautet wie folgt :


Schreiben Sie ein Skript, dass alle Dateien mit der länge 0 Byte im angegeben Verzeichnis zählt, anschließend auflistet und abfragt, ob die Dateien gelöscht werden sollen. Die Anzahl der übergebenen Parameter ist zu prüfen.
Mein Ansatz hier zu schaut wie folgt aus


cd .. #in root Ordner Wechseln
echo Pfad eingeben
read $Pfad #Lese Pfad
cd $Pfad #Geht zum Pfad
ls # listing des Ordners des Pfades
echo Alle Dateien mit 0 Byte
echo ""
find -size 0
ls
echo Möchten Sie $element[x] löschen? Y oder N
read $eingabe

Schleife drum rum aber wie :-)

if [$eingabe=Y]
then
rmdir $element[x]
x++
elif [$eingabe=N]
then x++
else
sh linux4.sh
fi

Nun ist die Frage, wie genau ich das dann mit der eingabe einlesen und überprüfen machen kann. Des weiteren wie das genau funktioniert, das ich die Funktion wie gefordert erhalte.


echo Pfad eingeben
read $Pfad #Lese Pfad
cd $Pfad #Geht zum Pfad

An der Stelle stellt sich für mich die Frage, wie ich es hinbekomme das ich in mehrer Verzeichnise dann wechseln kann. Weil ich mach ja vorher das cd .. dann komm ich ja in den root ordner aber wenn ich von da in den Ordner Desktop und dort in den Ordner Sicherung springen will wie kann ich das realisieren?
Nen Freund von mir und ich suchen verzweifelt jetzt eine Lösung. Haben auch in anderen Foren schon nachgefragt. Haben jetzt auch eine zweite Lösungsvariante aber die funktioniert auch noch nicht so wie wir uns das vorstellen.

cd .. #in root Ordner Wechseln
echo Pfad eingeben
read eingabe #Lese Pfad
Pfad=$eingabe # path
ls $Pfad
i=0
find $Pfad -size 0
while [read FILE]
do
element[$i]=$FILE
let i=i+1
done
echo weiter
j=0
for ((j=0; j<$i; j++)); do
echo -n "Delete ${element[$j]} ?"
read eingabe2
if [[ $eingabe2 == "y" ]]; then
echo "rm $element[$j]"
fi
done
echo Ende


Könntet ihr uns da evlt irgendwie bei weiter helfen. Haben auch schon mehrer Skripte von bspw. Selflinux oder bei dem tutorials.de das durchgearbeitet. War sehr hilfreich eigentlich. Aber auf ne vernünftige Lösung kommen wir allerdings nicht.

ContainerDriver
29-04-2008, 13:34
Hallo,

laut Aufgabenstellung wird der Pfad des zu durchsuchenden Verzeichnisses als Parameter an das Skript übergeben; Zugriff auf die Parameter erhältst du mit: $# (= Anzahl der übergebenen Argumente) und $1, $2, ... (= da liegen die Argumente drinnen).
Die Dateiliste kannst du dann (wie schon von dir erkannt) mit dem find-Befehl ausgeben lassen, allerdings arbeitet dein find-Aufruf noch rekursiv und listet auch Verzeichnisse (lt. Aufgabenstellung sollen ja nur Dateien angezeigt werden, zwar ist ein Verzeichnis auf Dateisystemebene auch nur eine Datei, aber das ist hier vermutlich nicht gemeint). Stichwörter für den richtigen find-Aufruf wären maxdepth und type.
Das Zählen könnte man auch mit einem find-Aufruf durchführen und die Ausgabe an wc weiterleiten, damit lassen sich die von find ausgegebenen Zeilen zählen.
Die Abfrage zum Löschen lässt sich wieder mit find realisieren, und zwar mit dem -exec Argument; dort kann man für jede gefundene Datei rm -i aufrufen (die Option gibt an, dass rm vor dem Löschen nachfragen soll).

Man hat jetzt natürlich drei (nahezu identische) find-Aufrufe, wahrscheinlich lässt sich das Skript noch optimieren, indem man die Ausgabe des ersten find-Aufrufes in einem Array bzw. einer temporären Datei zwischenspeichert.

Ich hab meinen Text jetzt natürlich etwas allgemein gehalten, weil ich da etwas von Schularbeiten (finde ich übrigens stark, dass man Shell-Programmierung auch in der Schule machen kann) gelesen habe ;) Wie weit seid ihr denn schon in dem Bereich? Kennt ihr schon Pipes und Ausgabeumleitungen?

Gruß, Florian

WeenerChild
29-04-2008, 18:57
foo (http://www.unixboard.de/vb3/showthread.php?p=294690) bar (http://www.linux-forum.de/shell-anfaenger-14515-3.html#post45977)


asdf