Advertisement
Guest User

chnames, bash-script for renaming mp3-files

a guest
Jun 5th, 2012
595
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 25.10 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # chnames.sh - Dateinamen ändern durch Ersetzen unliebsamer Zeichen.
  4. #
  5. # Copyright (C) 2005-2007 Conny Faber <conny@supple-pixels.net>
  6. # Die neueste Version, ein kleines Archiv mit sonderbaren und dennnoch
  7. # möglichen Dateinamen und die englische Version dieses Skripts sind zu
  8. # finden unter http://www.supple-pixels.net.
  9. #
  10. # Dieses Programm ist freie Software. Es kann unter den Bedingungen der GNU
  11. # General Public License, wie von der Free Software Foundation herausgegeben,
  12. # weitergegeben und/oder modifiziert werden, entweder gemäß Version 2 der
  13. # Lizenz oder (optional) jeder späteren Version.
  14. #
  15. # Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es
  16. # von Nutzen sein wird, aber OHNE JEDE GARANTIE, noch nicht einmal der der
  17. # VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details sind zu finden in der
  18. # Datei GNU General Public License (siehe Datei COPYING).
  19. #
  20.  
  21. # Dieses Skript habe ich v.a. zur Umbenennung von MP3-Dateien geschrieben,
  22. # die oft nicht nur Umlaute enthalten (Problem zwischen verschiedenen
  23. # Kodierungen), sondern auch noch diverse andere Zeichen wie Klammern, +, &,
  24. # Leerzeichen (ungünstig für einige Programme) etc.; aber auch andere Dateien
  25. # lassen sich mit chnames.sh automatisch prüfen und umbenennen.
  26. #
  27. # chnames.sh läßt sich nur UTF-8-kodiert in UTF-8-Shell verwenden, da das Skript
  28. # selbst Zeichen enthält, die außerhalb des ISO-8859-1-Bereiches liegen!
  29. #
  30. # ToDo - later:
  31. # -------------
  32. # -k = keep = mehrfache Vorkommen, z.B. --- ___ behalten
  33. # -s = substitute = eigene Ersetzungsformen angeben, z.B.
  34. #      -s '+|plus' -s '. |.'   (= -s [von|nach])
  35.  
  36.  
  37.  
  38. benutzung()
  39. {
  40. HILFE="chnames.sh - Umbenennen von Datei- und Verzeichnisnamen
  41.  
  42. Beschreibung:
  43. -------------
  44.  chnames.sh ist ein Shell-Skript, das v.a. zur Umbenennung von MP3-Dateien
  45.  entwickelt wurde, da diese oft Leerzeichen, Umlaute, Klammern und andere
  46.  unliebsame Zeichen enthalten. Es lassen sich per chnames.sh Dateien und
  47.  Verzeichnisse umbenennen, indem automatisch folgende Ersetzungen vorgenom-
  48.  men werden:
  49.  
  50.  (Hinweis: Um alle unten aufgeführten Zeichen sehen zu können, wird ein
  51.            Terminal benötigt, das UTF-8-Zeichen richtig anzeigen kann, z.B.
  52.            urxvt, gnome-terminal, konsole.)
  53.  
  54.  Zeichen                            Wird zu
  55.  ---------------------------------------------------------------------------
  56.  Klammern: () [] {} <>              -
  57.  Leerzeichen                        _
  58.  Ä Ö Ü ä ö ü ß                      Ae Oe Ue ae oe ue ss
  59.  + &                                _and_ bzw. _und_ (je nach Sprachwahl)
  60.  °                                  _deg_ bzw. _Grad_ (je nach Sprachwahl)
  61.  : ;                                .
  62.  ,                                  gefolgt von Leerzeichen: _
  63.                                     sonst:                   .
  64.  ' \" \` ´ ? ! ^ # * ¿ ¡ ,            Werden entfernt.
  65.  Akzentzeichen                      Werden zu Zeichen ohne Akzent:
  66.                                     ÀÁÂÃÅ - A        àáâãå - a
  67.                                     Æ     - AE       æ     - ae
  68.                                     ÇĆĈĊČ - C        çćĉċč - c
  69.                                     ÈÉÊË  - E        èéêë  - e
  70.                                     ÌÍÎÏ  - I        ìíîï  - i
  71.                                     Ñ     - N        ñ     - n
  72.                                     ÒÓÔÕØ - O        òóôõø - o
  73.                                     ŚŜŞŠ  - S        śŝşš  - s
  74.                                     ÙÚÛ   - U        ùúû   - u
  75.                                     Ý     - Y        ýÿ    - y
  76.                                     ŹŻŽ   - Z        źżž   - z
  77.  mehrere Leerzeichen - _ . ~        Werden auf 1 Zeichen reduziert.
  78.  - am Namensanfang                  Wird entfernt.
  79.  
  80.  
  81. Benutzung: chnames.sh <-d [dir]> <-D> <-g> <-r> <--check|--echeck|--no-log|-u>
  82. ---------  chnames.sh <-f [datei]>... <-g> <--check|--echeck>
  83.           chnames.sh <-h|--usage|--version>
  84.    
  85.  --check       Reiner Test: Tut so, als würde umbenannt werden. Ausgabe von
  86.                Original und potentiell zu verändernden Namen auf der Shell.
  87.                Es werden keine Namen verändert und keine Log-Datei angelegt.
  88.  -d [dir]      Verzeichnis angeben, in dem umbenannt werden soll.
  89.                (Default = aktuelles Verzeichnis)
  90.  -D            Benennt Verzeichnisse um, nicht Dateien.
  91.  --echeck      Extra-Check: Reine Überprüfung, ob Datei- oder Verzeichnis-
  92.                namen Zeichen außerhalb des ASCII-Bereichs enthalten. Erlaubt
  93.                sind die Zeichen 0-9, A-Z, a-z sowie - _ . und ~. Ausgabe der
  94.                Liste gefundener Namen erfolgt auf der Shell. Beim Extra-Check
  95.                werden keine Namen verändert. Hiermit kann z.B. nach dem Um-
  96.                benennen per chnames.sh geprüft werden, ob noch Namen übrig
  97.                sind, die per chnames.sh nicht berücksichtigte Akzentzeichen,
  98.                oder andere Sonderzeichen enthalten.
  99.  -f [file]     Einzelne Datei- oder Verzeichnisnamen zur Ersetzung übergeben.
  100.                Jeder Datei bzw. jedem Verzeichnis muss -f vorangestellt wer-
  101.                den.
  102.                Beachte: Hier wird der Umbenennungsvorgang nur in der Shell
  103.                         ausgegeben. Es wird keine Log-Datei und kein Undo-
  104.                         Skript angelegt.
  105.  -g            Sprache Deutsch für Ersetzungen festlegen:
  106.                - \"&\" und \"+\" werden zu \"_und_\" (default: \"_and_\")
  107.                - \"°\" wird zu \"_Grad_\" (default: \"_deg_\")
  108.  -h, --help    Zeigt diese Hilfe und beendet das Skript.
  109.  --no-log      Keine Log-Datei im Zielverzeichnis erzeugen. Standartgemäß
  110.                wird im Zielverzeichnis eine Log-Datei angelegt, die die
  111.                Original-Namen und die veränderten enthält.
  112.                (chnames_jjmmtt_hhmm.log)
  113.  -r            Rekursiver Durchlauf; geht nicht mit -f
  114.  -u            Undo-Skript im Zielverzeichnis anlegen. In Verbindung mit -r
  115.                wird das Skript nur ins oberste, nicht in die Unterverzeich-
  116.                nisse geschrieben. Durch Aufruf dieses Skriptes werden die
  117.                Original-Namen wiederhergestellt. (chnundo_jjmmtt_hhmm.sh)
  118.                Beachte: Gleichnamige Dateien werden als Backup mit Endung
  119.                         ~n~ gesichert, wobei n die Anzahl bedeutet. Diese
  120.                         Backup-Dateien werden durch das Undo-Skript NICHT
  121.                         wieder zurückbenannt!
  122.  --usage       Kurzhilfe zeigen und Skript beenden.
  123.  --version     Versionsinfo zeigen und Skript beenden.
  124.  
  125.  Beachte: Es kann nur -d (und -D) oder -f angegeben werden. Werden doch beide
  126.           Parameter genannt, wird nur -f ausgeführt, -d (und -D) nicht.
  127.  
  128.  
  129. Hinweise:
  130. ---------
  131.  chnames.sh läßt sich nur UTF-8-kodiert in einer UTF-8-Shell verwenden!
  132.  Diverse Checks ermitteln, ob ein Dateiname in einer der folgenden Kodierun-
  133.  gen vorliegt: UTF-8, ASCII, ISO-8859-1 oder allgemein andere Kodierung.
  134.  Umbenannt werden Dateinamen in ISO-8859-1-Kodierung, UTF-8 und ASCII.
  135.  Namen, die anders kodiert sind, werden gesondert gekennzeichnet, jedoch
  136.  nicht verändert. Damit auch ISO-8859-1-Namen bearbeitet werden können, muss
  137.  iconv installiert sein. Sollte iconv nicht auffindbar sein, werden in ISO-
  138.  8859-1 vorliegende Namen nur gekennzeichnet, nicht umbenannt.
  139.  
  140.  Dateien mit durchgehender Großschreibweise müssen ggf. manuell nachbearbei-
  141.  tet werden, da die Umlaute Ä, Ö, Ü nach Ae, Oe, Ue umbenannt werden.
  142.  
  143.  ACHTUNG: Die Überprüfung, in welcher Kodierung ein Name vorliegt, ist nicht
  144.           perfekt. Es ist nicht garantiert, dass sie immer richtig funktio-
  145.           niert, obwohl in meinen Tests bislang alles gut lief.
  146.           Ebenso bieten die in chnames.sh enthaltenen Umbenennungen nur
  147.           einen Rahmen, der aber nicht in jedem Einzelfall das Optimum ist.
  148.           Bitte mit offenen Augen genießen ;-)
  149.  
  150.  
  151. Beispiele:
  152. ----------
  153.  
  154.  chnames.sh
  155.    
  156.    ==> Benennt alle im aktuellen Verzeichnis liegenden Dateien um.
  157.        Log-Datei landet im aktuellen Ordner.
  158.  
  159.  chnames.sh -d ~/mp3/Deutsches -g -u -r
  160.    
  161.    ==> Benennt rekursiv alle Dateinamen ab dem angegebenen Verzeichnis um;
  162.        ersetzt dabei die Zeichen \"&\" und \"+\" durch ein deutsches \" und \".
  163.        Undo-Skript wird im angegebenen Verzeichnis angelegt, Log-Dateien in
  164.        jedem bearbeiteten Ordner.
  165.  
  166.  chnames.sh -D -d Jazz --no-log
  167.    
  168.    ==> Benennt alle Unterverzeichnisse des Ordners Jazz um. Geht dabei nicht
  169.        rekursiv vor. Legt keine Log-Datei an.
  170.  
  171.  chnames.sh -f \"~/mp3/Deutsches/Comedian Harmonists - Wochenend und \\
  172.  Sonnenschein.mp3\" -f \"~/mp3/Ethnic/04 - Touré Kunda - Aïyayao\"
  173.    
  174.    ==> Umbenennen einzeln angegebener Dateien; Umbenennungsvorgang wird nur
  175.        per Shell ausgegeben, nicht in eine Log-Datei.
  176.  
  177.  chnames.sh -r --check
  178.    
  179.    ==> Reiner Test: Was würde wie verändert werden, wenn es passieren würde.
  180.        Prüft rekursiv alle Dateien. Ausgabe per Shell.
  181.  
  182.  chnames.sh -r -d ~/mp3/Classic --echeck
  183.    
  184.    ==> Reiner Test, günstigerweise nach Umbenennung auszuführen: überprüft,
  185.        ob nicht berücksichtigte Sonderzeichen übrig sind. Durchsucht rekur-
  186.        siv die Inhalte des angegebenen Verzeichnisses. Ausgabe aller Namen,
  187.        die Zeichen ausserhalb des ASCII-Bereichs oder Leerzeichen enthalten,
  188.        erfolgt per Shell.
  189.  
  190.  
  191. Noch ein Tip:
  192. -------------
  193.  
  194.  find . -name \"chnames*.log\" -exec cat \"{}\" \";\" -ok rm \"{}\" \";\"
  195.    
  196.    ==> Schneller Überblick nach rekursivem Umbenennen:
  197.        Sucht ab dem aktuellen Verzeichnis rekursiv nach allen von chnames.sh
  198.        angelegten Log-Dateien, zeigt deren Inhalt mit cat an gefolgt von einer
  199.        Abfrage, ob die Log-Datei gelöscht werden soll oder nicht.
  200. "
  201.  
  202. echo "$HILFE" | less
  203. }
  204.  
  205.  
  206. kurzhilfe()
  207. {
  208. USAGE="
  209. Benutzung: chnames.sh <-d [dir]> <-D> <-g> <-r> <--check|--echeck|--no-log|-u>
  210. ---------  chnames.sh <-f [datei]>... <-g> <--check|--echeck>
  211.           chnames.sh <-h|--usage|--version>
  212.    
  213.  --check       Testdurchlauf
  214.  -d [dir]      Verzeichnis angeben
  215.  -D            Verzeichnisse umbenennen
  216.  --echeck      Extra-Check, sucht u.a. nicht berücksichtigte Zeichen
  217.  -f [file]     Einzelne Datei oder Verzeichnis umbenennen; -f pro Angabe
  218.  -g            Verwende Deutsch für Ersetzung von \"&\", \"+\" und \"°\"
  219.  -h, --help    Ausführlichere Hilfe
  220.  --no-log      Keine Log-Datei(en) anlegen
  221.  -r            Rekursiv
  222.  -u            Undo-Skript anlegen (chnundo_jjmmtt_hhmm.sh)
  223.  --usage       Kurzhilfe
  224.  --version     Versionsinfo
  225. "
  226.  
  227. echo "$USAGE"
  228. }
  229.  
  230.  
  231. versinfo()
  232. {
  233. VERSION="
  234. chnames.sh - Dateinamen ändern durch Ersetzen unliebsamer Zeichen.
  235. Version vom 27.04.2007
  236. Copyright (C) 2005-2007 Conny Faber <conny@supple-pixels.net>
  237. Eine englische Version dieses Skripts gibt es auf http://www.supple-pixels.net.
  238.  
  239. Dieses Programm ist freie Software. Details sind zu finden in der GNU
  240. General Public License (siehe Datei COPYING).
  241.  
  242. Viel Spaß :-)
  243. "
  244.  
  245. echo "$VERSION"
  246. }
  247.  
  248.  
  249. # Encoding prüfen
  250. checkenc()
  251. {
  252. NAME="${i##*/}"
  253. ORT="${i%/*}"
  254.  
  255. # Wenn NAME leer, sobald alle Zeichen aus ASC daraus entfernt wurden = ASCII
  256. if test -z "${NAME//$ASC}" ; then
  257. ENC="ASCII"
  258. else
  259.  if test -z "${NAME//$UTF}" ; then
  260.    ENC="UTF-8"
  261.  else
  262.    # Wenn iconv gefunden, dann Namens-Umwandlung testen
  263.    if test -n "$ICONVDA" ; then
  264.      NAMECONV=`echo "$NAME" | iconv -f ISO-8859-1 -t UTF-8`
  265.      if test -z "${NAMECONV//$LAT}" ; then
  266.        ENC="ISO-8859-1"
  267.      else
  268.        ENC="unbekannt"
  269.        # Für umbenennen() - Standart = 1 = umbenennen
  270.        UMB=0
  271.      fi
  272.    # Ansonsten ist auch ISO-8859-1 unbekannt
  273.    else
  274.      ENC="unbekannt"
  275.      UMB=0
  276.    fi
  277.  fi
  278. fi
  279. }
  280.  
  281.  
  282. # Reiner Check auf unliebsame Zeichen
  283. extracheck()
  284. {
  285. # Encoding prüfen
  286. checkenc
  287.  
  288. # Vergleichsname
  289. VNAME="${NAME//$GUTZEI}"
  290.  
  291. # Wenn noch Zeichen in VNAME stehen, dann sind dies unliebsame Zeichen.
  292. if test -n "$VNAME" ; then
  293.  FOUND=1
  294.  if test "$ORT" == "`pwd`" ; then
  295.    echo "$NAME  ...  Kodierung: $ENC"
  296.  else
  297.    echo "${i/`pwd`\/}  ...  Kodierung: $ENC"
  298.  fi
  299. fi
  300. }
  301.  
  302.  
  303. # Funktion zum Umbenennen
  304. umbenennen()
  305. {
  306. # Encoding prüfen
  307. checkenc
  308.  
  309. # Ausgabe des akt. Original-Namens
  310. if test "$ORT" == "`pwd`" ; then
  311.  echo "Org: $NAME"
  312. else
  313.  # nur relativen Pfad ausgeben
  314.  echo "Org: ${i/`pwd`\/}"
  315. fi
  316.  
  317.  
  318. # Wenn Kodierung unbekannt, nur Shell-Ausgabe
  319. if test $UMB -eq 0 ; then
  320.  echo -e "---  keine Änderung  ...  Kodierung ${ENC}\n"
  321.  
  322. else
  323.  
  324.  if test "$ENC" == "ISO-8859-1" ; then
  325.    x="$NAMECONV"
  326.  else
  327.    x="$NAME"
  328.  fi
  329.  
  330.  # Umbenennungen ausführen
  331.  # -----------------------
  332.  
  333.  # mehrere Leerzeichen durch eins ersetzen
  334.  x="`echo \"$x\" | sed 's/ \{2,\}/ /g'`"
  335.  
  336.  x="`echo \"$x\" | sed 's/ --* /-/g'`"  # Leer (mind. 1x: -) Leer durch -
  337.  x="`echo \"$x\" | sed 's/ __* /_/g'`"  # Leer (mind. 1x: _) Leer durch _
  338.  
  339.  x="${x//. /-}"          # .Leerzeichen durch -
  340.  x="${x//,[ -]/_}"       # ,Leerzeichen ,_ durch -
  341.  x="${x//,/.}"           # , durch .
  342.  
  343.  x="${x//[\'\"\`´\?\!\^#\*¿¡]}"     # entfernt ' " ` ´ ? ! ^ # * ¿ ¡
  344.   x="${x// [\[\(\{\<\]\)\}\>] /-}"   # Leer{[(<}])>Leer durch -
  345.   x="${x// [\[\(\{\<\]\)\}\>]/-}"    # Leer{[(<}])> durch -
  346.   x="${x//[\[\(\{\<\]\)\}\>] /-}"    # {[(<}])>Leer durch -
  347.   x="${x//[\[\(\{\<\]\)\}\>]/-}"     # {[(<}])> durch -
  348.  
  349.   x="${x// /-}"           # Leer durch -
  350.   x="${x//[:\;]/.}"       # : ; durch .
  351.  
  352.   # Umlaute
  353.   x="${x//ä/ae}"
  354.   x="${x//ö/oe}"
  355.   x="${x//ü/ue}"
  356.   x="${x//Ä/Ae}"
  357.   x="${x//Ö/Oe}"
  358.   x="${x//Ü/Ue}"
  359.   x="${x//ß/ss}"
  360.  
  361.   # Akzentzeichen
  362.   x="${x//[ÀÁÂÃÅ]/A}"
  363.   x="${x//Æ/AE}"
  364.   x="${x//[ÇĆĈĊČ]/C}"
  365.   x="${x//[ÈÉÊË]/E}"
  366.   x="${x//[ÌÍÎÏ]/I}"
  367.   x="${x//Ñ/N}"
  368.   x="${x//[ÒÓÔÕØ]/O}"
  369.   x="${x//[ŚŜŞŠ]/S}"
  370.   x="${x//[ÙÚÛ]/U}"
  371.   x="${x//Ý/Y}"
  372.   x="${x//[ŹŻŽ]/Z}"
  373.   x="${x//[àáâãå]/a}"
  374.   x="${x//æ/ae}"
  375.   x="${x//[çćĉċč]/c}"
  376.   x="${x//[èéêë]/e}"
  377.   x="${x//[ìíîï]/i}"
  378.   x="${x//ñ/n}"
  379.   x="${x//[òóôõø]/o}"
  380.   x="${x//[śŝşš]/s}"
  381.   x="${x//[ùúû]/u}"
  382.   x="${x//[ýÿ]/y}"
  383.   x="${x//[źżž]/z}"
  384.  
  385.   # + & je nach Sprachoption ersetzen
  386.   test $GER -eq 0 && x="${x//[\+&]/_and_}" || x="${x//[\+&]/_und_}"
  387.   # ° je nach Sprachoption ersetzen
  388.   test $GER -eq 0 && x="${x//°/_deg_}" || x="${x//°/_Grad_}"
  389.   # - an erster Stelle des Namens
  390.   test "${x:0:1}" == "-" && x="${x/[_-]}"
  391.  
  392.   # mehrere aufeinanderfolgende . - _ ~ reduzieren zu 1 Zeichen . - _ ~
  393.   x="`echo \"$x\" | sed 's/\.\{2,\}/./g'`"
  394.   x="`echo \"$x\" | sed 's/-\{2,\}/-/g'`"
  395.   x="`echo \"$x\" | sed 's/_\{2,\}/_/g'`"
  396.   x="`echo \"$x\" | sed 's/~\{2,\}/~/g'`"
  397.  
  398.   # Ungewöhnliche Zeichenkombinationen, die durch chnames.sh selbst
  399.   # entstehen könnten, beseitigen
  400.   x="${x//-_/-}"       # -_ durch -
  401.   x="${x//_-/-}"       # _- durch -
  402.   x="${x//[_\-~]./.}"  # _. -. ~. durch .
  403.   x="${x//._/-}"       # ._ durch - (passiert häufiger in MP3)
  404.   x="${x//.-/-}"       # .- durch -
  405.   x="${x//[_\-]~/~}"   # _~ -~ durch ~
  406.   x="${x//~[_\-]/~}"   # ~_ ~- durch ~
  407.  
  408.   # Durch die letzten Ersetzungen könnte es wieder zu doppelten Z. kommen:
  409.   x="`echo \"$x\" | sed 's/\.\{2,\}/./g'`"
  410.   x="`echo \"$x\" | sed 's/-\{2,\}/-/g'`"
  411.   x="`echo \"$x\" | sed 's/~\{2,\}/~/g'`"
  412.  
  413.  
  414.   # Betr. mv und Log-Datei
  415.   if test "$i" != "${ORT}/$x" ; then
  416.  
  417.     # Für das Schreiben des Undo-Skripts
  418.     CHANGED=1
  419.    
  420.     # Umbenennen
  421.     if test $CHECK -eq 0 ; then
  422.      
  423.       mv -f --backup=numbered "$i" "${ORT}/$x"
  424.      
  425.       # Für Undo-Skript
  426.       if test $USKRIPT -eq 1 ; then
  427.         Sx="${x//\`/\\\`}"
  428.         Sx="${Sx//\"/\\\"}"
  429.         Si="${i//\`/\\\`}"
  430.         Si="${Si//\"/\\\"}"
  431.        
  432.         SINHALT="$SINHALT
  433. echo \"von:  ${ORT}/$Sx\"
  434. echo \"nach: $Si\"
  435. mv -f --backup=numbered \"${ORT}/$Sx\" \"$Si\"
  436. echo
  437. "
  438.       fi
  439.     fi
  440.    
  441.     # Ausgabe des neuen Namens auf der Shell
  442.     if test "$ORT" == "`pwd`" -o "$ORT" == "." ; then
  443.       echo -e "NEU: ${x}\n"
  444.     else
  445.       echo -e "NEU: ${ORT/`pwd`\/}/${x}\n"
  446.     fi
  447.    
  448.     # Nur Veränderungen in Log-Datei schreiben
  449.     if test "$DOLOG" == "ja" ; then
  450.       if test "$ENC" == "ISO-8859-1" ; then
  451.         echo "Org:  $NAME (ISO-8859-1)" >> "${ORT}/chnames_${DATUM}.log"
  452.       else
  453.         echo "Org:  $NAME" >> "${ORT}/chnames_${DATUM}.log"
  454.       fi
  455.       echo -e "NEU:  ${x}\n" >> "${ORT}/chnames_${DATUM}.log"
  456.     fi
  457.    
  458.   else
  459.  
  460.     # nur Shell-Ausgabe
  461.     echo -e "---  keine Änderung\n"
  462.    
  463.   fi
  464.  
  465. fi
  466. }
  467.  
  468.  
  469. # BEGINN
  470. # ======
  471.  
  472. # chnames.sh funktioniert NICHT KORREKT in der bash-Version 2.05b.
  473. if test ${BASH_VERSINFO[0]} -lt 3 ; then
  474.   echo
  475.   echo "chnames.sh - ACHTUNG! - bash-Version"
  476.   echo
  477.   echo "chnames.sh wurde getestet mit bash-Version 2.05b und Versionen ab 3.0."
  478.   echo "Mit der Version 2.05b gab es Fehler."
  479.   echo "Es ist daher mindestens Version 3.0 noetig!"
  480.   echo
  481.   echo "chnames.sh beendet"
  482.   echo
  483.   exit 1
  484. fi
  485.  
  486. # Wenn chnames.sh NICHT in einem UTF-8-Terminal läuft, Abbruch und Meldung
  487. #if test -z "`locale | grep 'LC_CTYPE=.*UTF-8'`" ; then
  488. #  echo
  489. #  echo "chnames.sh - ACHTUNG! - UTF-8 benoetigt"
  490. #  echo
  491. #  echo "chnames.sh benoetigt zur korrekten Ausfuehrung ein UTF-8-Terminal."
  492. #  echo "Unter Systemen mit ISO-8859-1-Kodierung kann, vorausgesetzt die"
  493. #  echo "entsprechende locale steht zur Verfuegung, ein UTF-8-xterm z.B. wie"
  494. #  echo "folgt gestartet werden:"
  495. #  echo
  496. #  echo "  LC_CTYPE=\"de_DE.UTF-8\" xterm"
  497. #  echo
  498. #  echo "chnames.sh beendet"
  499. #  echo
  500. #  exit 1
  501. #fi
  502.  
  503. # Meldung falls das Skript unnatürlich beendet wird.
  504. trap 'echo "chnames.sh abgebrochen" ; echo "letzter Stand: $i" ; exit 1' 1 2 15
  505.  
  506.  
  507. # 0 = Default; wird bei -f = 1 gesetzt
  508. NURF=0
  509. # Falls nicht anders angegeben: aktuelles Verzeichnis
  510. ORT="`pwd`"
  511. # Falls nicht anders angegeben: Dateien umbenennen (d = Verz.)
  512. TYP="f"
  513. # Für Ersetzung von "&", "+" und "°" (default = Englisch = 0; Deutsch = 1)
  514. GER=0
  515. # Log-Datei: ja = Default; nein = wenn -f oder --no-log
  516. DOLOG="ja"
  517. # Für Eintrag in Log-Datei, falls keine Änderung
  518. CHANGED=0
  519. # Für Testdurchläufe (--check) (0 = tun; 1 = check)
  520. CHECK=0
  521. # Wenn rekursiv = 1
  522. REC=0
  523. # Undo-Skript erstellen = 1
  524. USKRIPT=0
  525. # Für Extra-Check = 1
  526. ECHECK=0
  527.  
  528.  
  529. # Parameterabfrage
  530. while test $# -gt 0; do
  531.   case $1 in
  532.     --check ) CHECK=1 ; DOLOG="nein" ; USKRIPT=0 ;;
  533.     -d ) ORT="$2" ; shift ;;
  534.     -D ) TYP="d" ;;
  535.     --echeck) CHECK=1 ; DOLOG="nein" ; USKRIPT=0 ; ECHECK=1
  536.               FOUND=0 ;;
  537.     -f )
  538.          if test $NURF -eq 0 ; then
  539.            if test $REC -eq 0 ; then
  540.              NURF=1
  541.              DOLOG="nein"
  542.              USKRIPT=0
  543.              FILES="$2"
  544.            else
  545.              kurzhilfe ; exit 1
  546.            fi
  547.          else
  548.            FILES="${FILES}\n$2"
  549.          fi
  550.          shift ;;
  551.     -g ) GER=1 ;;
  552.     --no-log ) DOLOG="nein" ;;
  553.     -r )
  554.          # Wenn -f angegeben ist, darf NICHT rekursiv gesetzt sein
  555.          if test -$NURF -eq 0 ; then
  556.            REC=1
  557.          else
  558.            kurzhilfe ; exit 1
  559.          fi ;;
  560.     --version ) versinfo ; exit 0 ;;
  561.     -u ) test $NURF -eq 0 && USKRIPT=1 || USKRIPT=0 ;;
  562.     --usage ) kurzhilfe ; exit 0 ;;
  563.     --help | -h ) benutzung ; exit 0 ;;
  564.     * ) kurzhilfe ; exit 1 ;;
  565.   esac
  566.   shift
  567. done
  568.  
  569. # Für Undo-Skript
  570. SORT="$ORT"
  571.  
  572. # Leerzeichen nicht als Trenner ansehen
  573. IFS=$'\n'
  574.  
  575. echo
  576.  
  577. # Wenn Extra-Check
  578. if test $ECHECK -eq 1 ; then
  579.   echo -e "*** chnames.sh - Starte Extra-Check ***\n"
  580. # Wenn Check
  581. elif test $CHECK -eq 1 -a $ECHECK -eq 0 ; then
  582.   echo -e "*** chnames.sh - Starte Check ***\n"
  583. # Wenn Umbenennen
  584. else
  585.   echo -e "*** chnames.sh - Starte Umbenennen ***\n"
  586. fi
  587.  
  588.  
  589. # Für alle Dateien/Verzeichnisse in 1 Verzeichnis oder rekursiv
  590. if test $NURF -eq 0 ; then
  591.  
  592.   # Wenn 1 Verzeichnis (nicht rekursiv)
  593.   if test $REC -eq 0 ; then
  594.     OK=0
  595.     # Wenn Extra-Check, Verzeichnis-test auf rx
  596.     if test $ECHECK -eq 1 ; then
  597.       test -r "$ORT" -a -x "$ORT" && OK=1
  598.     else
  599.       test -r "$ORT" -a -w "$ORT" -a -x "$ORT" && OK=1
  600.     fi
  601.    
  602.     # Wenn die vorherigen Abfragen OK, dann FILES füllen
  603.     if test $OK -eq 1 ; then
  604.       FILES=`find "$ORT" -maxdepth 1 -mindepth 1 -type "$TYP" | sort`
  605.     else
  606.       # Fehlermeldung + Abbruch
  607.       echo "${ORT}:"
  608.       echo "Berechtigungen überprüfen!"
  609.       echo "*** chnames.sh beendet ***"
  610.       echo
  611.       exit 1
  612.     fi
  613.  
  614.   # Wenn rekursiv
  615.   else
  616.     # Bei Verzeichnis-Umbenennung -r muss umgekehrt sortiert werden
  617.     if test "$TYP" == "d" ; then
  618.       FILES=`find "$ORT" -mindepth 1 -type "$TYP" | sort -r`
  619.     # Bei Datei-Umbenennung aufsteigend sortieren
  620.     else
  621.       FILES=`find "$ORT" -mindepth 1 -type "$TYP" | sort`
  622.     fi
  623.   fi
  624. fi
  625.  
  626.  
  627. # Wenn iconv vorhanden ist, können auch ISO-8859-1-Namen umbenannt bzw.
  628. # bei --echeck die Kodierung ISO-8859-1 ermittelt werden.
  629. # Anmerkung: Eigentlich werden Namen per convmv automatisch und gut umkodiert;
  630. # dessen Ausgabe läßt sich jedoch nicht abfangen, was hier sehr störend wäre.
  631. # Statt iconv könnte ebensogut recode verwendet werden.
  632. ICONVDA=`which iconv`
  633.  
  634. if test -n "$ICONVDA" ; then
  635.   # LAT = ISO-8859-1 - Hierin nicht enthalten: ¦¨©ª«¬­®¯²³¶·¸¹º»¼½¾
  636.   LAT="[\]\[\!\"#\$%&\'\(\)\*\+,\-.0123456789:\;<=>\?ABCDEFGHIJKLMNOPQRSTUVWXYZ \\\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}~¡¢£¤¥§°±´µ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ]"
  637.  # UTF-8 - enthält alle alphanumerischen Zeichen, Space, Tab, Satzzeichen
  638.  UTF="[[:alnum:][:blank:][:punct:]]"
  639. fi
  640.  
  641. # ASCII-Zeichen für checkenc() - hierin nicht enthalten: / @
  642. ASC="[\]\[\!\"#\$%&\'\(\)\*\+,\-.0123456789:\;<=>\?ABCDEFGHIJKLMNOPQRSTUVWXYZ \\\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}~]"
  643.  
  644. # Für extracheck() - Erwünschte Zeichen in Namen:
  645. test $ECHECK -eq 1 && \
  646. GUTZEI="[-_~.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]"
  647.  
  648.  
  649. # Für Namen in Log-Datei und Undo-Skript
  650. if test "$DOLOG" == "ja" -o $USKRIPT -eq 1 ; then
  651.   DATUM=`date +"%y%m%d_%H%M"`
  652. fi
  653.  
  654. # Undo-Skript vorbereiten
  655. if test $USKRIPT -eq 1 ; then
  656.  
  657.   # Bei -d werden nur relative Pfade im Undo-Skript gesichert. Hiermit
  658.   # wird vor dem Umbenennen in das Verzeichnis gewechselt, aus dem der
  659.   # ursprüngliche chnames.sh-Aufruf erfolgte.
  660.   CDTO=`pwd`
  661.  
  662.   SDATE=`date +"%c"`
  663.   SINHALT='#!/bin/bash'
  664.   SINHALT="$SINHALT
  665.  
  666. # chnames.sh Undo-Skript
  667. # Generiert am $SDATE
  668.  
  669. echo
  670. echo 'chnames.sh - Undo-Skript'
  671. echo
  672.  
  673. if test \"\$1\" != \"--do\" ; then
  674.  echo 'Aufruf per \"./chnundo_jjmmtt_hhmm.sh --do\", um zurück zu benennen.'
  675.  echo 'Gleichnamige Ziele werden überschrieben und als Backup gesichert.'
  676.  echo
  677.  exit 1
  678. fi
  679.  
  680. echo \"Wechsle in das Verzeichnis, wo chnames.sh ursprünglich aufgerufen wurde:\"
  681. echo \"cd nach ${CDTO}/\"
  682. cd \"$CDTO\"
  683. echo
  684. echo 'Benenne um ...'
  685. echo
  686. "
  687. fi
  688.  
  689.  
  690. for i in `echo -e "$FILES"` ; do
  691.  
  692.   # Falls später Problem mit Verzeichnis auftaucht:
  693.   WEITER="ja"
  694.   # Falls Namen in ISO-8859-1 vorliegen, dann = "ja"
  695.   ISTISO="nein"
  696.   # Wenn Kodierung unbekannt = 0, sonst 1 (für umbenennen())
  697.   UMB=1
  698.  
  699.  
  700.   # Wenn -f oder -r: Verzeichnisrechte testen
  701.   if test $NURF -eq 1 -o $REC -eq 1 ; then
  702.     OK=0
  703.    
  704.     # Wenn Extra-Check, Verzeichnistest auf rx, sonst rwx
  705.     # (die bash ist viel schneller als ein Aufruf von dirname)
  706.     if test $ECHECK -eq 1 ; then
  707.       test -r "${i%/*}" -a -x "${i%/*}" && OK=1
  708.     else
  709.       test -r "${i%/*}" -a -w "${i%/*}" -a -x "${i%/*}" && OK=1
  710.     fi
  711.    
  712.     # Wenn vorherige Abfragen NICHT OK
  713.     if test $OK -eq 0 ; then
  714.       WEITER="nein"
  715.      
  716.       # Fehlermeldung betr. spezielles Verzeichnis
  717.       echo "${i}:"
  718.       echo "***  Vorgang nicht möglich. Berechtigungen überprüfen!"
  719.       echo
  720.     fi
  721.   fi
  722.  
  723.   if test "$WEITER" == "ja" ; then
  724.    
  725.     if test $ECHECK -eq 1 ; then
  726.      
  727.       # Funktionsaufruf für Extra-Check
  728.       extracheck
  729.    
  730.     else
  731.      
  732.       # Sind Dateien bzw. Verzeichnisse rw?
  733.       if test -r "$i" -a -w "$i" ; then
  734.         # Funktion "umbenennen" aufrufen
  735.         umbenennen
  736.       else
  737.         echo "${i}:"
  738.         echo "***  Umbenennen nicht möglich. Berechtigungen überprüfen."
  739.         echo
  740.       fi
  741.     fi
  742.   fi
  743.  
  744. done
  745.  
  746.  
  747. # Wenn Extra-Check
  748. if test $ECHECK -eq 1 ; then
  749.   if test $FOUND -eq 1 ; then
  750.     echo
  751.     echo "*** Die ausgegebenen Namen enthalten unliebsame Zeichen oder ***"
  752.     echo "*** liegen in einer anderen Kodierung als UTF-8 / ASCII vor. ***"
  753.   else
  754.     echo "*** Keine unliebsamen Namen gefunden. ***"
  755.   fi
  756.   echo
  757.   echo "*** chnames.sh - Extra-Check beendet ***"
  758.   echo
  759.  
  760. # Wenn Check
  761. elif test $CHECK -eq 1 -a $ECHECK -eq 0 ; then
  762.   echo "*** chnames.sh - Check beendet ***"
  763.   echo
  764.  
  765. # Wenn Umbenennen
  766. else
  767.   echo "*** chnames.sh - Umbenennen beendet ***"
  768.   echo
  769. fi
  770.  
  771.  
  772. # Undo-Skript endgültig schreiben + Berechtigung setzen (rwx------)
  773. if test $USKRIPT -eq 1 -a $CHECK -eq 0 -a $CHANGED -eq 1 ; then
  774.   echo "$SINHALT" > "${SORT}/chnundo_${DATUM}.sh"
  775.   chmod 700 "${SORT}/chnundo_${DATUM}.sh"
  776. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement