[Howto] Umlaute in Dateinamen ersetzen (SSH)

  • Guten Tag Qnap-Gemeinde.
    Zur Zeit habe ich ein Problem mit Dateien, in denen Umlaute enthalten sind auf die ich nicht mer zugreifen kann. Diese Dateien sind aus 2009 von einem Nas-Umzug.
    Alle aktuelle Dateien mit Umlauten stellen also kein Problem dar. Die Codierung im Nas ist richtig eingestellt.
    Under SMB sietht die Datei so aus: L_scher
    Mit WinSCP sieht die Datei so aus:L�scher
    wenn ich mich mit Putty anmelde ist die Darstellung Korrekt: Lüscher
    Über die Konsole ist es jetzt möglich die Datei vom Umlaut zu befreien und ist dann wieder über SMB erreichbar.

    Code
    mv Lüscher Luescher


    Folgendes hatte ich über google gefunden, hat aber leider nicht funktioniert.

    Code
    find . -name *[äöüÄÖÜß]* -printf "'%P' "`


    Um dies bei allen Dateien von Hand zu machen, müsste ich jetzt Stundenlang jede einzelne Datei ändern.
    Ich wäre sehr dankbar, wenn mir jemand helfen könnte, eine Befehlszeile zu schreiben mit der alle Umlaute in den Dateien im aktuellen Ordner durch ue, ae, oe ersetzt werden.
    Besten Dank schon mal im voraus
    Mein aktuelles Nas ist ein 419P 2

    Einmal editiert, zuletzt von christian () aus folgendem Grund: Thema umbenannt und verschoben.

  • Hi,


    ich würde dir raten das Problem (evtl. auch auf Englisch) zu googlen und nichts ungeprüft einfach per copy und pase auszuführen. Insbesondere per root und SSH hast du hier ein Riesenpotential Fehler zu machen (wenn man sich nicht mit sed, awk, find, exec etc. auskennt).


    Zitat von "baer750"

    Ich wäre sehr dankbar, wenn mir jemand helfen könnte, eine Befehlszeile zu schreiben mit der alle Umlaute in den Dateien im aktuellen Ordner durch ue, ae, oe ersetzt werden.


    Da ich das Problem nicht selbst habe (nutze keine Umlaute in Dateinamen) und ich nicht der Shell Experte bin kann ich nur einen Denkanstoss geben. Ich nutze folgende Befehlszeile um Leerzeichen " " durch "." zu ersetzen. Auszuführen im Unterordner in dem die problematischen Dateien liegen; nicht in / oder /share oder so. Nur z.B. in /share/homes/mustermann/problematischer/Pfad:


    Code
    $MY_FIND . -depth -name '* *' | while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done


    Ich nutze das ganze in einer Bash innerhalb eines Scripts. $MY_FIND zeigt auf /opt/bin/find und kommt wahrscheinlich aus optware.


    Anstatt "mv -i" könnte man auf das Suchergebniss auch ein "rename" anwenden, habe es aber nicht probiert. Ein anderes Forum erwähnt folgende Befehlszeile.
    Das ist wahrscheinlich das was du suchst
    :


    Code
    find -name "*[äöüÄÖÜß]*" -exec rename 's/ä/ae/g;s/ü/ue/g;s/ß/ss/g;s/Ä/Ae/g;s/Ü/Ue/g;s/Ö/Oe/g;s/ö/oe/g' {} \;


    Viel Glück
    /tobi

  • Hallo Tobi
    besten Dank für Deine Antwort. Nach Eingabe dieser Zeile

    Code
    find -name "*[äöüÄÖÜß]*" -exec rename 's/ä/ae/g;s/ü/ue/g;s/ß/ss/g;s/Ä/Ae/g;s/Ü/Ue/g;s/Ö/Oe/g;s/ö/oe/g' {} \;


    erhalte ich nachfolgende Meldung:

    Code
    [~] #     find -name "*[äöüÄÖÜß]*" -exec rename 's/ä/ae/g;s/ü/ue/g;s/ß/ss/g;s/Ä/Ae/g;s/Ü/Ue/g;s/Ö/Oe/g;s/ö/oe/g' {} \;BusyBox v1.01 (2014.12.02-18:08+0000) multi-call binaryUsage: find [PATH...] [EXPRESSION]Search for files in a directory hierarchy.  The default PATH isthe current directory; default EXPRESSION is '-print'EXPRESSION may consist of:        -follow         Dereference symbolic links.        -name PATTERN   File name (leading directories removed) matches PATTERN.        -print          Print (default and assumed).        -type X         Filetype matches X (where X is one of: f,d,l,b,c,...)        -perm PERMS     Permissions match any of (+NNN); all of (-NNN);                        or exactly (NNN)        -mtime TIME     Modified time is greater than (+N); less than (-N);                        or exactly (N) days


    Dein Vorschlag mit den Lehrzeichen habe ich auch gleich ausprobiert:

    Code
    $MY_FIND . -depth -name '* *' | while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done


    Leider hat es nicht die gewünschte Wirkung, die Rückmeldung ist:

    Code
    [~] #     $MY_FIND . -depth -name '* *' | while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done
    -sh: .: -d: invalid option
    .: usage: . filename [arguments]
    [~] #


    Könnte es sein dass noch ein Fehler im Code enthalten ist? Mein Nas ist mit ARM Prozessor, spielt das ev. eine Rolle? Auch habe ich in den Dateinamen ausserdem noch leerzeichen.
    Bin Dankbar für weitere Hinweise wie ich zu meinem gewünschten Resultat komme.
    Urs

    Einmal editiert, zuletzt von dr_mike () aus folgendem Grund: Quote durch Codeblock ersetzt. Weitere Codeblocks hinzugefügt.

  • Beide Befehle funktionieren nicht ohne weitere Anpassungen, da der Paramete -exec so nicht unterstützt wird.
    Dazu würde ua. zusätzlich das QPKG Optwar benötigt.


    Beim zweiten Befehl ist das erste eine Variable $MY_FIND und müßte daher durch de find Befehl ersetzt werden.

  • Besten Dank für den Hinweis. Habe auf dem Nas optware IPKG installiert. Hat aber auch nichts gebracht.


    Zitat

    Beim zweiten Befehl ist das erste eine Variable $MY_FIND und müßte daher durch de find Befehl ersetzt werden.


    Code
    find . -depth -name '* *' | while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done


    Auch das abändern des Befehles SMY_FIND auf find bewirkt nichts. Es wird die selbe Antwort ausgegeben wie weiter oben schon geschrieben.
    Eraser-EMC2, Du schreibst:

    Zitat

    Dazu würde ua. zusätzlich das QPKG Optwar benötigt.


    was meinst Du unter anderem?

  • Mit Optware kannst du weitere Programme installieren.
    Ich bin mir jetzt nicht sicher, denke aber es war "coreutils".
    Entweder du installierst es über dessen WebGUI bzw. über die Konsole mit

    Code
    ipkg install coreutils


    Damit bekommst du ein neues find mit mehr Parametern.

  • Zitat von "Eraser-EMC2-"

    Ich bin mir jetzt nicht sicher, denke aber es war "coreutils".


    Ich denke es könnte auch "findutils" sein.


    Code
    ipkg updateipkg install findutils


    Und dann das richtige find nutzen:

    Code
    /opt/bin/find -name "*[äöüÄÖÜß]*" -exec rename 's/ä/ae/g;s/ü/ue/g;s/ß/ss/g;s/Ä/Ae/g;s/Ü/Ue/g;s/Ö/Oe/g;s/ö/oe/g' {} \;


    /tobi

  • Ganz lieben Dank für Eure Tips. Habe coreutils installiert und den Tip von Tobi verfolgt. Anbei das Resultat.


    Die eingabe von dem Code

    Code
    ipkg updateipkg install findutils


    ergab folgende Meldung: Ist das so in Ordnung?

    Code
    [~] #     ipkg updateDownloading http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/Packages.gzInflating http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/Packages.gzUpdated list of available packages in /opt/lib/ipkg/lists/cs08q1armelSuccessfully terminated.[~] #     ipkg install findutilsPackage findutils (4.2.32-1) installed in root is up to date.Nothing to be doneSuccessfully terminated.[~] #


    Code
    /opt/bin/find -name "*[äöüÄÖÜß]*" -exec rename 's/ä/ae/g;s/ü/ue/g;s/ß/ss/g;s/Ä/Ae/g;s/Ü/Ue/g;s/Ö/Oe/g;s/ö/oe/g' {} \;


    wechsel in den Unterordner, auflisten des Inhaltes und ausführen des obigen codes ergab folgende Meldung:


      [~] # cd /share/HDC_DATA/film/test
      [/share/HDC_DATA/film/test] # ls
      überprüfen_der_änderung.txt*
      [/share/HDC_DATA/film/test] # /opt/bin/find -name "*[äöüÄÖÜß]*" -exec rename 's/ä/ae/g;s/ü/ue/g;s/ß/ss/g;s/Ä/Ae/g;s/Ü/Ue/g;s/Ö/Oe/g;s/ö/oe/g' {} \;
      /opt/bin/find: rename: No such file or directory
      [/share/HDC_DATA/film/test] #


    obwohl die Datei da ist findet er sie nicht um die Änderung vorzunehmen. Muss der Befehl "find" ev. mit dem Pfad ergänzt werden? Ich bin jetzt davon ausgegangen, dass ich den code im Ordner, wo die Dateien sich befinden, auszuführen ist.
    Was könnte ich weiter noch machen?

    Einmal editiert, zuletzt von TobiasK () aus folgendem Grund: Code Block eingefügt.

  • Ich denke wir nähren uns an ;)


    Ich muss raten, aber mache mal:


    Code
    ipkg install perl-file-rename


    Wenn rename nun bekannt ist müsste die komplette Zeile so lauten:

    Code
    /opt/bin/find -name "*[äöüÄÖÜß]*" -exec /opt/bin/rename 's/ä/ae/g;s/ü/ue/g;s/ß/ss/g;s/Ä/Ae/g;s/Ü/Ue/g;s/Ö/Oe/g;s/ö/oe/g' {} \;


    Zitat von "baer750"

    obwohl die Datei da ist findet er sie nicht um die Änderung vorzunehmen. Muss der Befehl "find" ev. mit dem Pfad ergänzt werden? Ich bin jetzt davon ausgegangen, dass ich den code im Ordner, wo die Dateien sich befinden, auszuführen ist.
    Was könnte ich weiter noch machen?


    Nein, das Problem ist, dass er "rename" nicht finden kann. Obige Befehle sollten das nachholen.


    /tobi


    Edit: habe es gerade ausprobiert, bei mir funktioniert es mit deiner oben genannten Beispieldatei.

  • :D :thumb:
    Danke, Danke Tobi. Das war die Lösung.
    Vielen lieben Dank auch Dir Eraser-EMC2 für Dein Beitrag.
    Wenn der Code ausgeführt wird, braucht es eine weile bis der Ordner durchgearbeitet ist, also nicht zu früh abbrechen. Bei einem Ordner von 25 Dateien, ca. 5 sek.

  • Zitat von "baer750"

    Das war die Lösung.


    Schön, dass es funktioniert.


    So ganz glücklich bin ich mit der Lösung aber nicht:
    1) Wie du gemerkt hast ist dieser Weg nicht besonders portabel
    2) Nach deiner Beschreibung ist der Weg auch nicht besonders performant
    3) Eine generische Lösung sieht auch anders aus (man stelle sich vor man möchte auch "@", "!" usw. ersetzen...)


    Aber sei es drum.


    Bitte frage du mal einen Admin ob wir das in die HowTo Section verschieben sollten? Mit Netzwerkeinstellungen hat das ganze sicherlich nichts zu tun ;) Vorschlag für den Titel:

    Zitat

    "[Howto] Umlaute in Dateinamen ersetzen (SSH)"


    Obwohl der Code auch Ordner umbenennt. Aber Schluss jetzt...


    /tobi

  • Vielleicht nicht die eleganteste Lösung, aber bei mir hat es auch funktioniert...
    Hatte mir schon die Haare gerauft und wäre fast verzweifelt...
    Nun konnte ich die "?" Dateinen endlich wieder los werden...


    Danke !

  • Moin!
    Habe das gleiche Problem, aber kann leider Eure Lösungen nicht nachvollziehen. Weder "rename" noch "ipkg" sind gültige Kommandos in meinem QNAP Terminal. Installiert ist 4.2.1 gibt es das da nicht mehr?
    Danke für einen Tipp!
    fthomsen


    Noch eine Ergänzung: In diesem Artikel:
    https://helpdesk.qnap.com/inde…so-codepage-file-encoding
    Wird die Anwendung von convmv empfohlen. Leider auch nicht als Kommando in der QNAP shell vorhanden....