bulk rename files

peterle

Forenkasper
Ich habe das Problem, daß ich immer wieder Dateien habe, die Umlaute und/oder Sonderzeichen habe. Wenn ich die aber zwischen verschiedenen Dateisystemen hin- und herschiebe, dann gibt das oft einen Haufen Probleme in nicht kopierten Dateien.

Bei der Suche nach einer Lösung bin ich über dieses Script hier gestolpert, welches ich hier gefunden habe:
http://www.sax.de/unix-stammtisch/docs/misc/shell.html

Code:
#!/bin/bash
# rename files containing control characters and umlauts in their name
# (C) Reinhard Wobst, @(#) 7.Apr 17:38


typeset -i n

find . -print | while read fn do replace="$(echo -n "$fn" | tr '[\001-\040]' '[_*]')"

replace="$(echo "$replace" | sed -e 's-ä-ae-g' -e 's-ö-oe-g' -e 's-ü-ue-g' \ -e 's-Ä-Ae-g' -e 's-Ö-Oe-g' -e 's-Ü-Ue-g' \ -e 's-ß-ss-g' )"

[ "$replace" = "$fn" ] && continue

[ -a "$replace" ] && { n=0 while [ -a "$replace$n" ] ; do let n+=1; done replace="$replace$n" }

echo renaming \""$fn\"" to \""$replace\"" mv "$fn" "$replace" done | cat -vt | tee ${1:-.deNTprot}

Blöderweise tut es das unter einem Fedora schon mal nicht, denn der meldet dann:
# Zeile 14: Syntaxfehler beim unerwarteten Wort `do'

Das ist dann doof :D
Noch doofer ist, daß ich nicht recht weiß, wo der Fehler in der Syntax liegen soll, geschweige denn, wo ich dazu etwas finden kann. :o

Falls jemand dazu etwas weiß oder ein anderes Script in der Ecke liegen hat, freue ich mich darüber. :)

Ich wollte das gefundene als grundlage nehmen und dann noch um : und Leerzeichen erweitern.

Danke.
 
iconv habe ich mir schon mal angesehen, aber es geht mir weniger um Lokalisierungen, sondern um die Dateinamen.

Wo genau ist denn "zwischen "fn" und "do""?
Angemeckert wird diese Zeile:
[ -a "$replace" ] && { n=0 while [ -a "$replace$n" ] ; do let n+=1; done replace=" ...
 
Puh, das Skript war etwas unübersichtlich. Ich habe es mal ein bisschen anders formatiert und dabei die Semikolons korrekt gesetzt, jetzt sollte es gehen:
Code:
#!/usr/bin/env bash                                                                                                                                          
# rename files containing control characters and umlauts in their name
# (C) Reinhard Wobst, @(#) 7.Apr 17:38


typeset -i n

find . -print |
  while read fn; do
  replace="$(echo -n "$fn" | tr '[\001-\040]' '[_*]')"
  replace="$(echo "$replace" |
    sed -e 's-ä-ae-g' \
        -e 's-ö-oe-g' \
        -e 's-ü-ue-g' \
        -e 's-Ä-Ae-g' \
        -e 's-Ö-Oe-g' \
        -e 's-Ü-Ue-g' \
        -e 's-ß-ss-g' )"

  [ "$replace" = "$fn" ] && continue
  [ -a "$replace" ] && {
    n=0
    while [ -a "$replace$n" ]; do
      let n+=1
    done
    replace="$replace$n" 
  }  
  echo renaming \""$fn\"" to \""$replace\"" mv "$fn" "$replace"

done | cat -vt | tee ${1:-.deNTprot}
 
Danke!

Ich habe es noch etwas korrigiert, da das mv in der echo-Zeile nicht ausgeführt wurde, sondern lediglich ausgedruckt wurde.
Dann habe ich noch die Doppelpunkte durch Unterstricher ersetzt und das log-file umbenannt.

Den Punkt mit dem "fn do" habe ich dann auch endlich gesehen.

Code:
    #!/usr/bin/env bash                                                                                                               
    # rename files containing control characters and umlauts in their name
    # (C) Reinhard Wobst, @(#) 7.Apr 17:38


    typeset -i n

    find . -print |
      while read fn; do
      replace="$(echo -n "$fn" | tr '[\001-\040]' '[_*]')"
      replace="$(echo "$replace" |
        sed -e 's-ä-ae-g' \
            -e 's-ö-oe-g' \
            -e 's-ü-ue-g' \
            -e 's-Ä-Ae-g' \
            -e 's-Ö-Oe-g' \
            -e 's-Ü-Ue-g' \
            -e 's-ß-ss-g' \
            -e 's-:-_-g')"

      [ "$replace" = "$fn" ] && continue
      [ -a "$replace" ] && {
        n=0
        while [ -a "$replace$n" ]; do
          let n+=1
        done
        replace="$replace$n"
      }
      echo renaming \""$fn\"" to \""$replace\""
      mv "$fn" "$replace"

    done | cat -vt | tee ${1:-.unixice-all-files-prot.log}
 
Zurück
Oben