Umlaute und so umbenennen... - ntfs probleme?

ianders

ianders

Linux Jungspund
Hallo,

ich hatte mir mal vor einiger Zeit ein Script gebastelt, was auch für mich zufriedenstellend arbeitet. Ziel ist es Daten und Ordner mit Umlauten (Sonderzeichen, ...) zu finden und umzubenennen. Nun wollte ich das Script wieder anwenden - auf ext3 und FAT32 Partitionen kein Problem, aber auf der ntfs-Partition verweigert sich das Script vernünftig zu laufen. Also es geht zwar los aber beim Umbenennen kommt immer die Fehlermeldung:
mv: Verschieben von [Pfad und alter Dateiname] nach [Pfad und neuer Dateiname] nicht möglich: Datei oder Verzeichnis nicht gefunden
Ich verstehe nun nicht wie es zu diesem Fehler kommt.
Das es zu dieser Fehlermeldung kommt wenn er den Ordner umbenannt hat bevor er die Dateien umbenennt (umgekehrt wäre besser, weiß aber gerade nicht wie) ist klar, aber das ist hier nicht der Fall, denn wenn ich die Daten auf eine andere Festplatte kopiere, dann läuft das Script wies soll.

Code:
#!/bin/bash
trap 'test -d umlautetmp && rm -r umlautetmp; exit 1' 2
#script zum suchen und umbenennen von dateien mit umlauten, apostoph und leerzeichen
mkdir umlautetmp

echo "Script zum suchen und Umbenennen von Umlauten. Apostroph UND Leerzeichen  "
echo "Verzeichniss angeben aber ACHTUNG Achtung: nichs fuer $HOME:"
read verz

if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -depth -iname "* *" -o -iname "*_*" -o -iname "*Ä*" -o -iname "*Ö*" -o -iname "*Ü*" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*" -o -iname "ß" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*" -o -iname "Ãœ*" -o -iname "*ß*" -o -iname "*Ä*" -o -iname "*´*" -o -iname "*´*" > umlautetmp/old.tmp
    #cat umleer.tmp
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -depth -iname "* *" -o -iname "*_*" -o -iname "*Ä*" -o -iname "*Ö*" -o -iname "*Ü*" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*" -o -iname "ß" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*" -o -iname "Ãœ*" -o -iname "*ß" -o -iname "*ß*" -o -iname "*Ä*"  -o -iname "*´*" -o -iname "*´*" > umlautetmp/old.tmp
    #cat umleer.tmp
fi
cat umlautetmp/old.tmp | sed -e 's/Ä/ae/g; s/Ö/oe/g; s/Ü/ue/g; s/ä/ae/g; s/ö/oe/g; s/ü/ue/g; s/ß/ss/g; s/ß/ss/g; s/ö/oe/g; s/ä/ae/g; s/ü/ue/g; s/Ãœ/ue/g; s/Ö/oe/g; s/ß/sz/g; s/Ãœ/ue/g; s/ß/ss/g; s/Ä/ae/g; s/Ä„/ae/g; s/ß/ss/g; s/ //g; s/_//g; s/Ä/ae/g; s/´//g; s/´//g' >umlautetmp/new.tmp

anz=`wc -l<umlautetmp/old.tmp`
i=1
while [ $i -le $anz ] ; do
    oldzeile=`head -$i umlautetmp/old.tmp | tail -1`
    newzeile=`head -$i umlautetmp/new.tmp | tail -1`
    oldbasename=`basename "$oldzeile"`
    newbasename=`basename "$newzeile"`
    filetype=`file "$oldzeile" | cut -d: -f2`
    echo "$filetype '$oldbasename' in '$newbasename' umbenennen...?(y/n)"
    echo ' yes ? '
    read best
    if [ "$best" = y ] ; then
        mv "$oldzeile" "$newzeile"
    fi
    i=`expr $i + 1`
done

test -d umlautetmp && rm -r umlautetmp
exit 0

#-----ERRORCODES-----
#1 -- CTRL + C abbruch
P.S.: also manuell die Daten und Ordner umbenennen geht, aber das wollte ich nicht machen, dafür sind es viel zu viele Daten...
Edit 11.6.08:
PPS.:
Verwendetes System: Suse 10.3
 
Zuletzt bearbeitet:
Schuss ins blaue:
- Deine ntfs Partitition readonly gemountet?
- Mount als root, script als user ?
 
ich kann beides leider ausschließen


Könnte es sein dass der Befehl mv unter ntfs anders arbeitet??? bzw. dass das Script generell unter ntfs etwas anders arbeitet??? ich wüsste zwar keinen Grund, aber irgendwie muss es ja zu dieser Fehlermeldung kommen. Ich meine selbst wenn ich jetzt nur eine Testdatei in einem Ordner habe und dieser selbst auch keine weiteren Unterordner besitzt, kommt trotzdem die Fehlermeldung mv: Verschieben von [Pfad und alter Dateiname] nach [Pfad und neuer Dateiname] nicht möglich: Datei oder Verzeichnis nicht gefunden
:hilfe2:
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

hab mal das Script ein bisschen verändert, jetzt kommt allerdings eine andere Fehlermeldung: mv: angegebenes Ziel „' [ Pfad und Name des neuen Dateinamens ] '“ ist kein Verzeichnis
woran klemmt es denn jetzt? ?(
Code:
#!/bin/bash
trap 'test -d umlautetmp && rm -r umlautetmp; exit 1' 2
#script zum suchen und umbenennen von dateien mit umlauten, apostoph und leerzeichen
mkdir umlautetmp

echo "Script zum suchen und Umbenennen von Umlauten. Apostroph UND Leerzeichen  "
echo "Verzeichniss angeben aber ACHTUNG Achtung: nichs fuer $HOME:"
read verz

if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -depth -iname "* *" -o -iname "*_*" -o -iname "*Ä*" -o -iname "*Ö*" -o -iname "*Ü*" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*" -o -iname "ß" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*" -o -iname "Ãœ*" -o -iname "*ß*" -o -iname "*Ä*" -o -iname "*´*" -o -iname "*´*" > umlautetmp/old.tmp
    #cat umleer.tmp
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -depth -iname "* *" -o -iname "*_*" -o -iname "*Ä*" -o -iname "*Ö*" -o -iname "*Ü*" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*" -o -iname "ß" -o -iname "*ä*" -o -iname "*ö*" -o -iname "*ü*" -o -iname "*ß*" -o -iname "Ãœ*" -o -iname "*ß" -o -iname "*ß*" -o -iname "*Ä*"  -o -iname "*´*" -o -iname "*´*" > umlautetmp/old.tmp
    #cat umleer.tmp
fi
cat umlautetmp/old.tmp | sed -e 's/Ä/ae/g; s/Ö/oe/g; s/Ü/ue/g; s/ä/ae/g; s/ö/oe/g; s/ü/ue/g; s/ß/ss/g; s/ß/ss/g; s/ö/oe/g; s/ä/ae/g; s/ü/ue/g; s/Ãœ/ue/g; s/Ö/oe/g; s/ß/sz/g; s/Ãœ/ue/g; s/ß/ss/g; s/Ä/ae/g; s/Ä„/ae/g; s/ß/ss/g; s/ //g; s/_//g; s/Ä/ae/g; s/´//g; s/´//g' >umlautetmp/new.tmp

anz=`wc -l<umlautetmp/old.tmp`
i=1
while [ $i -le $anz ] ; do
    oldzeile=`head -$i umlautetmp/old.tmp | tail -1`
    newzeile=`head -$i umlautetmp/new.tmp | tail -1`
    oldbasename=`basename "$oldzeile"`
    newbasename=`basename "$newzeile"`
    filetype=`file "$oldzeile" | cut -d: -f2`
    echo "$filetype '$oldbasename' in '$newbasename' umbenennen...?(y/n)"
    echo ' yes ? '
    read best
    if [ "$best" = y ] ; then
        mv \'$oldzeile\' \'$newzeile\'
    fi
    i=`expr $i + 1`
done

test -d umlautetmp && rm -r umlautetmp
exit 0

#-----ERRORCODES-----
#1 -- CTRL + C abbruch
 
Zuletzt bearbeitet:
Sollen wir uns jetzt extra ntfs-Partitionen erstellen, um dein Skript zu debuggen? 0o

Mach doch mal "manuell" ein mv-Versuch auf der ntfs-Partition. Sprich benenne irgendeine Datei mit Umlauten mal um. (Respektive versuchs)
Wenn das klappt mach mal'n Versuch mit ner abgespeckten Version des find-Einzeilers in Kombination mit mv. Funktionierts immernoch? Verstehst du das Prinzip? Klein anfangen, immer weiter aufbauen bis der Fehler kommt..

Und bitte die Versuche (die "shell-Sitzung") möglichst im Wortlaut (Befehle und (Fehler-)Meldungen) hier posten.
 
wenn ich vm so eingebe gehts:
Code:
ilja@linux-sijn:~/1TB_EXTERN/Sicherung_DatenREISER240GB/Programme/script> mv '/home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/- Ä # + ß 0 9 8 7 66  Ä Ö Ü_ * ?ß ? _=_)_(_%2f_&_%%_$_§__!' '/home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/oooooooooo'

mit dem Script kommt das:
Code:
ilja@linux-sijn:~/1TB_EXTERN/Sicherung_DatenREISER240GB/Programme/script> ./umlautescripten3
Script zum suchen und Umbenennen von Umlauten. Apostroph UND Leerzeichen
Verzeichniss angeben aber ACHTUNG Achtung: nichs fuer /home/ilja:
/home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/
Suchen nach Dateien in /home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/...
 ASCII text '- Ä # + ß 0 9 8 7 66  Ä Ö Ü _ * ?ß ? _=_)_(_%2f_&_%%_$_§_!öööööööööööö' in '-ae#+ss098766aeoeue*?ss?=)(%2f&%%$§!oeoeoeoeoeoeoeoeoeoeoeoe' umbenennen...?(y/n)
 yes ?
y
mv: angegebenes Ziel „'/home/ilja/1TBEXTERN/SicherungDatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/-ae#+ss098766aeoeue*?ss?=)(%2f&%%$§!oeoeoeoeoeoeoeoeoeoeoeoe'“ ist kein Verzeichnis
 Vim swap file, version 7.1 '.- Ä # + ß 0 9 8 7 66  Ä Ö Ü .swp' in '.-ae#+ss098766aeoeue.swp' umbenennen...?(y/n)
 yes ?
y
mv: angegebenes Ziel „'/home/ilja/1TBEXTERN/SicherungDatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/.-ae#+ss098766aeoeue.swp'“ ist kein Verzeichnis
 ASCII text '1223 2 45  ä ö ü ß ü  ä - . ö ä ß 0 9 8 7 6 j m ö. ä ü  #ä ö ü ü ö' in '1223245aeoeuessueae-.oeaess09876jmoe.aeue#aeoeueueoe' umbenennen...?(y/n)
 yes ?
y
mv: angegebenes Ziel „'/home/ilja/1TBEXTERN/SicherungDatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/1223245aeoeuessueae-.oeaess09876jmoe.aeue#aeoeueueoe'“ ist kein Verzeichnis
 ASCII text '1223 2 45  ä ö ü ß ü ä - . ö ä ß 0 9 8 7 6 j m ö. ä ü  #ä ö ü ü öa' in '1223245aeoeuessueae-.oeaess09876jmoe.aeue#aeoeueueoea' umbenennen...?(y/n)
 yes ?
y
mv: angegebenes Ziel „'/home/ilja/1TBEXTERN/SicherungDatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/1223245aeoeuessueae-.oeaess09876jmoe.aeue#aeoeueueoea'“ ist kein Verzeichnis
 ASCII text '1223 2 45  ä ö ü ß ü ä - . ö ä ß 0 9 8 7 6 j m ö. ä ü  #ä ö ü ü ös' in '1223245aeoeuessueae-.oeaess09876jmoe.aeue#aeoeueueoes' umbenennen...?(y/n)
 yes ?
y
mv: angegebenes Ziel „'/home/ilja/1TBEXTERN/SicherungDatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/1223245aeoeuessueae-.oeaess09876jmoe.aeue#aeoeueueoes'“ ist kein Verzeichnis
 empty 'öäüßüäö üäöü' in 'oeaeuessueaeoeueaeoeue' umbenennen...?(y/n)
 yes ?
y
mv: angegebenes Ziel „'/home/ilja/1TBEXTERN/SicherungDatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/oeaeuessueaeoeueaeoeue'“ ist kein Verzeichnis
 empty 'öäüßüäöüä öü' in 'oeaeuessueaeoeueaeoeue' umbenennen...?(y/n)
 yes ?
y
mv: angegebenes Ziel „'/home/ilja/1TBEXTERN/SicherungDatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/oeaeuessueaeoeueaeoeue'“ ist kein Verzeichnis
 empty 'öäüßüäöüäöü' in 'oeaeuessueaeoeueaeoeue' umbenennen...?(y/n)
 yes ?
y
mv: Aufruf von stat für „'/home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/öäüßüäöüäöü'“ nicht möglich: Datei oder Verzeichnis nicht gefunden
 
Grade mal das Skript "geskimmt", was soll denn das hier:
Code:
mv \'$oldzeile\' \'$newzeile\'
Könntest du vielleicht mal die escapten single-quotes durch einfache double-quotes ersetzen?
(kA, wenn das allerdings das Problem sein sollte, hätte das Skript eigentlich niemals funktionieren sollen..)
 
guck mal in der obersten Version vom Script, da sind es double-quotes allerdings kommt es dann zu der Fehlermeldung (siehe mein erstes Post)
da es jedoch keinen Unterschied macht ob ich
Code:
ilja@linux-sijn:~/1TB_EXTERN/Sicherung_DatenREISER240GB/Programme/script> mv "/home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/öäüß" "/home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/oeaeuess"
oder
Code:
ilja@linux-sijn:~/1TB_EXTERN/Sicherung_DatenREISER240GB/Programme/script> mv '/home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/- Ä # + ß 0 9 8 7 66  Ä Ö Ü_ * ?ß ? _=_)_(_%2f_&_%%_$_§__!' '/home/ilja/1TB_EXTERN/Sicherung_DatenREISER240GB/TTEESSTT/TEST/TTEESSTT/TEST1/oooooooooo'
mache dachte ich, ich probier mal single-quotes
und ohne quotes geht es gar nicht
ich denke es liegt hier irgendwie an dieser Stelle, aber ich weiß nicht an was genau...
 
Ja dann finde es heraus...
Sprich: gehe sequenziell jede einzelne Anweisung einzeln durch in einer interaktiven Shell. Mit Variablen und Dateien. Guck dir an was in den Variablen/Dateien ist etc.

Shell-Skripte debuggen ist unfassbar trivial.
 
Hallo
Ich bin es langsam leid, jedesmal auf das hier hinzuweisen. Das ist auch ein Grund, warum ich mich verstärkt mit Antworten zurückhalte.
Bevor ich also meine Glaskugel rund laufen lass, versuch es mal mit den Boardregeln bezüglich meines Hinweises.
Zu NTFS kann ich mangels eigener Erfahrung wenig beitragen.
Allerdings solltest du als erstes mal die Mountoptionen auf verwendete nls-Option prüfen.
Ehrlich gesagt, habe ich auch wenig Lust fremde Scripte zu debuggen.

Deshalb hangel dich mit eingebautem echo $VARNAME an diversen Stellen durch.

Wolfgang
 

Ähnliche Themen

script sshpass

Verschlüsseltes Backup-Script mit rsync

HandbrakeCLI Shell Skript

Wie komme ich an den Inhalt des Inhalts einer Variable?

Queue für copy Script

Zurück
Oben