Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: Wie Dateinamen mit Großbuchstaben in Kleinbuchstaben konvertieren?

  1. #1
    Registrierter Benutzer
    Registriert seit
    Sep 2006
    Beiträge
    1.121

    Question Wie Dateinamen mit Großbuchstaben in Kleinbuchstaben konvertieren?

    Wie kann man Dateinamen mit Großbuchstaben in Kleinbuchstaben konvertieren?

    Ich habe bisher nur etwas für einfache Dateien gefunden und nur das aktuelle Verzeichnis, aber ich brauche das für alle Dateien (auch Verzeichnisse) und natürlich rekursiv.

    Mein erster Versuch sieht so aus:

    Code:
    find -exec mv -i {} \; `echo {} \; | tr [A-ZAeOeUe] [a-zAeOeUe]`
    Aber find beschwert sich:
    find: paths must precede expressiontype

    Irgendwelche Vorschläge?

  2. #2
    ... Avatar von Flummi
    Registriert seit
    Sep 2005
    Beiträge
    358
    Keine Ahnung ob der Rest des Befehls richtig ist, aber find beschwert sich, dass es zuerst den Pfad möchte, den es durchsuchen soll und dann erst die Optionen. Zum Beispiel für das aktuelle Verzeichnis und alle darunter liegenden:
    Code:
    find . -exec file {} \;

  3. #3
    Newbie and practicing Avatar von Newbie314
    Registriert seit
    Mar 2007
    Beiträge
    7.639
    evtl. Krename installieren .... habs bei mir grad wieder installiert: es kann das... ...
    Geändert von Newbie314 (04.10.07 um 09:43 Uhr)

  4. #4
    ... Avatar von Flummi
    Registriert seit
    Sep 2005
    Beiträge
    358
    Krename? No need to. Drei Minuten googlen bringt die Lösung:

    Code:
    find . -type f | while read i; do mv "$i" "`echo "$i" | tr "A-Z" "a-z"`"; done

  5. #5
    ... Avatar von Flummi
    Registriert seit
    Sep 2005
    Beiträge
    358
    Dieser schnelle Hack sollte dem vorherigen vorgezogen werden, da er auch mit Subdirectories und Leerzeichen umgehen kann:

    Code:
    find . -type f | while read i; do
        file="${i##*/}";
        directory="${i%/*}";
        mv "$i" "$directory"/"`echo "$file" | tr "A-Z" "a-z"`" ;
    done
    hth,
    Flummi.

  6. #6
    Registrierter Benutzer
    Registriert seit
    Sep 2006
    Beiträge
    1.121
    Zitat Zitat von Flummi Beitrag anzeigen
    Dieser schnelle Hack sollte dem vorherigen vorgezogen werden, da er auch mit Subdirectories und Leerzeichen umgehen kann:

    Code:
    find . -type f | while read i; do
        file="${i##*/}";
        directory="${i%/*}";
        mv "$i" "$directory"/"`echo "$file" | tr "A-Z" "a-z"`" ;
    done
    hth,
    Flummi.
    Danke. Und wie sieht das für Verzeichnisse aus?

  7. #7
    Registrierter Benutzer Avatar von snowcrash23
    Registriert seit
    Jun 2006
    Ort
    Unbekannt Verzogen
    Beiträge
    577
    Zitat Zitat von Noether Beitrag anzeigen
    Danke. Und wie sieht das für Verzeichnisse aus?
    Ich denke man muss das type -f (files) durch ein type -d (directorys) ersätzen, also
    Code:
    find . -type d | while read i; do
        file="${i##*/}";
        directory="${i%/*}";
        mv "$i" "$directory"/"`echo "$file" | tr "A-Z" "a-z"`" ;
    done
    MfG
    snowcrash23
    OS:Arch LinuxCPU:Core i5-2500K
    MB:P8P67PRORAM:16GB DDR3GK:NV GTX570

    Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn

  8. #8
    Registrierter Benutzer
    Registriert seit
    Sep 2006
    Beiträge
    1.121
    Zitat Zitat von snowcrash23 Beitrag anzeigen
    Ich denke man muss das type -f (files) durch ein type -d (directorys) ersätzen, also
    Code:
    find . -type d | while read i; do
        file="${i##*/}";
        directory="${i%/*}";
        mv "$i" "$directory"/"`echo "$file" | tr "A-Z" "a-z"`" ;
    done
    MfG
    snowcrash23
    Geht nicht.

  9. #9
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.054
    sehr exakte Fehlerbeschreibung...

    ein echo um den mv gibt bei mir zumindest sinnvolle Befehle aus...
    Ich bin root - ich darf das.

  10. #10
    ... Avatar von Flummi
    Registriert seit
    Sep 2005
    Beiträge
    358
    Code:
    # X ist durch die maximale Tiefe der Verzeichnisstruktur
    # zu ersetzten. Keine Sorge, wählt man hier zuviel, gibt
    # es halt ein paar Fehlermeldungen, passieren sollte aber nichts.
    for i in `seq 1 X`; do
       find . -maxdepth $i -type d | while read j; do
          mv "$j" "`echo "$j" | tr "A-Z" "a-z"`";
       done
    done

  11. #11
    Registrierter Benutzer
    Registriert seit
    Sep 2006
    Beiträge
    1.121
    Zitat Zitat von Flummi Beitrag anzeigen
    Code:
    # X ist durch die maximale Tiefe der Verzeichnisstruktur
    # zu ersetzten. Keine Sorge, wählt man hier zuviel, gibt
    # es halt ein paar Fehlermeldungen, passieren sollte aber nichts.
    for i in `seq 1 X`; do
       find . -maxdepth $i -type d | while read j; do
          mv "$j" "`echo "$j" | tr "A-Z" "a-z"`";
       done
    done
    Sieht ok aus, aber wieso gibt's Probleme mit der Tiefe?

  12. #12
    Registrierter Benutzer
    Registriert seit
    Jun 2004
    Beiträge
    1.423

    Leicht OT

    Zitat Zitat von Flummi Beitrag anzeigen
    Dieser schnelle Hack sollte dem vorherigen vorgezogen werden, da er auch mit Subdirectories und Leerzeichen umgehen kann:

    Code:
    find . -type f | while read i; do
        file="${i##*/}";
        directory="${i%/*}";
        mv "$i" "$directory"/"`echo "$file" | tr "A-Z" "a-z"`" ;
    done
    hth,
    Flummi.
    Wenn ich mich mal kurz einmischen darf, sollte vielleicht statt:
    Code:
    ...
        file="${i##*/}";
        directory="${i%/*}";
    ....
    Code:
    ...
        file="${basename $i}"         # braucht kein ';'  - NewLine
        directory="${dirname $i}"     # braucht kein ';'  - NewLine
    ....
    verwendet werden?

  13. #13
    ... Avatar von Flummi
    Registriert seit
    Sep 2005
    Beiträge
    358
    Nö, das ist vollkommen egal. Hat komplett den selben Effekt, nur dass man mit den Bash-Builtin-Befehlen etwas effizienter ist und dass diese natürlich viel breiter anwendbar sind. Man könnte ja zum Beispiel auch wollen, dass das letzte Segment von Dateien die Bindestriche enthalten in Kleinbuchstaben konvertiert werden, also zB sowas hier: abc-def-GHI. Das geht dann mit dir-/basename nicht mehr.

    Edit: Ich weiß, dass die Semikolons nicht notwendig waren, aber ich hab das auf der Kommandozeile als Einzeiler eingetippt und dann hier reingepastet und formatiert :P

  14. #14
    Registrierter Benutzer
    Registriert seit
    Sep 2006
    Beiträge
    1.121
    Ok, also es funktioniert nun hiermit, wenn auch ziemlich lahm:

    Code:
    #!/bin/bash
    
    #set -x
    
    typeset -i i
    
    # rename directories
    for i in `seq 1 99`; do
       find . -maxdepth $i -type d | while read j; do
          mv -v -i "$j" "`echo "$j" | tr "A-Z" "a-z"`";
       done
    done
    
    # rename simple files
    find . -depth -type f | while read j; do
        file="${j##*/}"
        directory="${j%/*}"
    #   file="${basename $j}"         # braucht kein ';'  - NewLine,
    # gibt aber Fehler "bad substitution"
    #    directory="${dirname $j}"     # braucht kein ';'  - NewLine,
    # gibt aber Fehler "bad substitution"
    #echo file="$file"
    #echo directory="$directory"
        mv -v -i "$j" "$directory"/"`echo "$file" | tr "A-Z" "a-z"`" ;
    done
    
    exit 0
    Allerdings gibt's immer noch ein paar Fehler; z. B.:

    mv: cannot move `./html/01/07' to a subdirectory of itself, `./html/01/07/07'
    mv: overwrite `./html/01/01'? mv: cannot stat `4': No such file or directory

    Irgendwelche Vorschläge?


    Jetzt ist mir aber klar, wofür die Schleife mit dem seq ist: Ansonsten würde nicht versucht ein Verzeichnis sondern den Pfad umzubenennen und das schlägt fast immer fehlt.

    Mir ist aber noch nicht ganz klar, wieso die Variante mit basename und dirname nicht funktioniert und wieso ${i##*/} und ${i%/*} funktionieren. Kann mich da mal jemand aufklären?
    Geändert von Noether (06.10.07 um 22:03 Uhr)

  15. #15
    ... Avatar von Flummi
    Registriert seit
    Sep 2005
    Beiträge
    358
    Zitat Zitat von Noether Beitrag anzeigen
    Ok, also es funktioniert nun hiermit, wenn auch ziemlich lahm:
    Ja, das ist bei Bash-Skripten oft so. Aber was soll's, dafür sind sie schnell erstellt

    Allerdings gibt's immer noch ein paar Fehler; z. B.:

    mv: cannot move `./html/01/07' to a subdirectory of itself, `./html/01/07/07'
    mv: overwrite `./html/01/01'? mv: cannot stat `4': No such file or directory

    Irgendwelche Vorschläge?
    Einfach ignorieren. Wenn's dich so stört, kannst du die Fehlerausgabe nach /dev/null umleiten (`befehl 2> /dev/null).

    Mir ist aber noch nicht ganz klar, wieso die Variante mit basename und dirname nicht funktioniert und wieso ${i##*/} und ${i%/*} funktionieren. Kann mich da mal jemand aufklären?
    Warum es mit base- und dirname nicht funktioniert, kann ich ad hoc auch nicht erkennen. Warum die Bash-Built-In-Variante funktioniert schon, das erklärt die man page (man bash, dann "Slash eingeben und nach ## suchen):

    Code:
           ${parameter#word}
           ${parameter##word}
                  The word is expanded to produce a pattern just  as  in  pathname
                  expansion.  If the pattern matches the beginning of the value of
                  parameter, then the result of  the  expansion  is  the  expanded
                  value of parameter with the shortest matching pattern (the ``#''
                  case) or the longest matching pattern (the ``##'' case) deleted.
                  If parameter is @ or *, the pattern removal operation is applied
                  to each positional parameter in turn, and the expansion  is  the
                  resultant  list.   If parameter is an array variable subscripted
                  with @ or *, the pattern removal operation is  applied  to  each
                  member  of the array in turn, and the expansion is the resultant
                  list.
    
           ${parameter%word}
           ${parameter%%word}
                  The word is expanded to produce a pattern just  as  in  pathname
                  expansion.   If  the  pattern  matches a trailing portion of the
                  expanded value of parameter, then the result of the expansion is
                  the  expanded value of parameter with the shortest matching pat-
                  tern (the ``%'' case)  or  the  longest  matching  pattern  (the
                  ``%%''  case)  deleted.   If  parameter  is  @ or *, the pattern
                  removal operation is applied to  each  positional  parameter  in
                  turn,  and the expansion is the resultant list.  If parameter is
                  an array variable subscripted with @ or *, the  pattern  removal
                  operation  is  applied  to each member of the array in turn, and
                  the expansion is the resultant list.

Ähnliche Themen

  1. Dateinamen fat32-kompatibel konvertieren
    Von Smartie im Forum Anwendungen Allgemein, Software
    Antworten: 6
    Letzter Beitrag: 05.08.07, 20:41
  2. SuSE 9.1, Dateinamen konvertieren nach utf8
    Von jean_luc_picard im Forum System installieren und konfigurieren
    Antworten: 5
    Letzter Beitrag: 23.05.04, 01:54
  3. Leerzeichen entfernen aus Dateinamen
    Von clumsy im Forum Linux Allgemein
    Antworten: 7
    Letzter Beitrag: 18.03.04, 11:33
  4. Dateinamen in Grossbuchstaben in Kleinbuchstaben umbenennen
    Von HEMIcuda im Forum Linux Allgemein
    Antworten: 3
    Letzter Beitrag: 01.02.04, 16:08
  5. Alle Wörter in Dateinamen mit Großbuchstaben beginnen lassen
    Von detonation997 im Forum Linux Allgemein
    Antworten: 6
    Letzter Beitrag: 20.06.03, 15:30

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •