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