Mailinglist Archive: opensuse-de (4826 mails)

< Previous Next >
Re: Eine Lössung für alle del anstatt von rm
  • From: Jan.Trippler@xxxxxxxxxxx (Jan Trippler)
  • Date: Tue, 15 Apr 2003 23:43:23 +0000 (UTC)
  • Message-id: <20030415230057.A16341@xxxxxxxxxxxxxx>
On Die, 15 Apr 2003 at 21:09 (+0200), Jan Trippler wrote:
[...]

Ups, da habe ich doch glatt einen fiesen Fehler von Dir übernommen,
Patrice :-)

Ich würde folgenden Ansatz angehen (ungetestet):

cnt=1
for file in "$@"
^^^^ da drin steht der aktuelle Dateiname.
do
new="$trash/`basename \"$1\"`-$$.$cnt"
^^ und deshalb ist das hier Quatsch!
So muss es heißen:
new="$trash/`basename \"$file\"`-$$.$cnt"

mv "$file" "$new"
if [ $? -eq 0 ] ; then
echo "$file wurde nach $new verschoben"
else
echo "Es konnte nicht gelöscht werden!"
fi
cnt=`expr $cnt + 1`
done

Bei der Gelegenheit habe ich gleich noch mal nachgedacht: Es kann
ja immer noch sein, dass zufällig eine Datei gleichen Namens in
trash existiert. Außerdem haben wir noch das Problem, dass der
Anwender u. U. Verzeichnisse angibt. Deshalb ist folgender Ansatz
besser:

cnt=1
for file in "$@"
do
if test -d "$file"; then
echo "Verzeichnisse können nicht nach $trash verschoben werden"
continue
fi
new="$trash/`basename \"$file\"`"
while test -f "$new"; do
cnt=`expr $cnt + 1`
new="$trash/`basename \"$file\"`-$$.$cnt"
done
mv "$file" "$new"
if [ $? -eq 0 ] ; then
echo "$file wurde nach $new verschoben"
else
echo "Es konnte nicht gelöscht werden!"
fi
done

Jetzt kann höchstens noch die while-Schleife bis zum MAXINT laufen
und dann das Script abbrechen, aber wenn dieser Fall eintritt, läuft
eh was schief ;-)

Und zu guter Letzt noch was: Dieser Mülleimer nutzt Dir wenig, wenn
Du Dir nicht merkst, wie die Originalpfade der Dateien hießen (dann
wird nämlich das Wiederherstellen ein ziemliches Rätselraten). Als
schnelle Hilfe könntest Du eine Textdatei in trash hinterlegen, die
den Originalpfad speichert:

Folgende Zeile direkt nach dem mkdir ausführen (das verhindert, dass
der Anwender vielleicht gerade eine Datei .filelist löscht und damit
unsere Liste sabotiert ;-):
test -f $trash/.filelist || touch $trash/.filelist

und nach dem mv:
...
if [ $? -eq 0 ] ; then
echo "$file wurde nach $new verschoben"
echo "`pwd`: $file -> $new" >>$trash/.filelist
else
echo "Es konnte nicht gelöscht werden!"
fi
...

Das pwd zum Anfang hat den Sinn, bei relativen Pfaden zu wissen, wo
das aktuelle Verzeichnis war. Die Ausgabe in die Dateiliste kann man
natürlich beliebig verfeinern ;-)

Eine andere Alternative: Alle verschobenen Dateien werden mit ihrem
Pfad verschoben (dann kann man das auch für Verzeichnisse erlauben -
vorausgesetzt, sie liegen im gleichen Dateisystem):

cnt=1
for file in "$@"
do
if test -d "$file"; then
newfn=
newdn="$file"
else
newfn="`basename \"$file\"`"
newdn="`dirname \"$file\"`"
fi
newdn="$trash`(cd \"$newdn\"; pwd)`"
while test -f "$newdn/$newfn"; do
cnt=`expr $cnt + 1`
newfn="$trash/`basename \"$file\"`-$$.$cnt"
done
mkdir -p "$newdn" && mv "$file" "$newdn/$newfn"
if [ $? -eq 0 ] ; then
echo "$file wurde nach $new verschoben"
else
echo "Es konnte nicht gelöscht werden!"
fi
done

Warum nun dieser Aufwand zum Erzeugen von $newdn? Damit kriegt man -
egal wie das Ausgangsargument aussieht - einen sauberen absoluten
Pfadnamen hin:
jan@k500:~> mkdir tmp/dir\ mit\ leer
jan@k500:~> x=../jan/tmp/dir\ mit\ leer/abc
jan@k500:~> newdn="`(cd \"\`dirname \\\"$x\\\"\`\"; pwd)`"
jan@k500:~> echo $newdn
/home/jan/tmp/dir mit leer

Alles dies ist nicht komplett durchgetestet - also gut nachgucken!

Jan


< Previous Next >
Follow Ups