ubuntuusers.de

Für diese Funktion musst du eingeloggt sein.

Hilfe bei bash script (deNT)

Status: Ungelöst | Ubuntu-Version: Ubuntu
Antworten |

dragnod0

Anmeldungsdatum:
28. April 2008

Beiträge: 63

Hallo an alle, ich habe hier ein Problem mit einem Script. Er soll Dateinamen die nicht Linux konform sind umbenennen. Also Leerzeichen zu untersrichen, umlaute zu ae ue usw.

Ich habe mir den Script mit Copy&Paste von einer Seite Kopiert http://www.sax.de/unix-stammtisch/docs/misc/shell.html

Leider läuft er nicht 😢

Hier erst mal der Script (deNT)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/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} 

Beim Ausführen des Scripts bekomme ich einen Syntaxfeler:

/usr/bin/deNT: Zeile 14: Syntaxfehler beim unerwarteten Wort `do'
/usr/bin/deNT: Zeile 14: `[ -a "$replace" ] && { n=0 while [ -a "$replace$n" ] ; do let n+=1; done replace="$replace$n" }'

Leider kenne ich mich mit Skripten so gut wie gar nicht aus und sehe den Fehler nicht. Ich würde mich wirklich darüber freuen wenn mir jemand dabei helfen würde.

Gruß dragnod0

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

Hallo an alle, ich habe hier ein Problem mit einem Script. Er soll Dateinamen die nicht Linux konform sind umbenennen. Also Leerzeichen zu untersrichen, umlaute zu ae ue usw.

Das ist aber schon linuxkonform. Nicht-linuxkonform ist lediglich die binäre 0 und der Slash - letzterer trennt die Verzeichnisnamen voneinander und vom Dateinamen.

Umlaute geht auch mit Linux - beim Einbinden des NT-Dateisystems (habe ich das richtig verstanden?) ist aber wohl die richtige Einstellung zu treffen.

Bequemer kann es allerdings sein, keine Blanks im Dateinamen zu haben.

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

Oh jeh, keine gute Quelle, würd ich sagen:

  • Find erkennt die Dateien korrekt, und print macht daraus Texte, die schon fehleranfällig sind.

  • While bewirkt eine Schleife - die hatte man mit Find schon.

  • Hat man mit -print noch nicht genug angerichtet darf nun 'echo' nochmal.

1
find -execdir rename -n 's/[\001-\040]/_/g' {} ";"

sollte das gleiche ungleich besser machen, aber auch wie oben, evtl. vorhandene Dateien überschreiben, weil mehrere Zeichen zu _ übersetzt werden, was ja auch vorab schon existieren kann.

Den Rest überschaue ich nicht. Werden da doch Zahlen angehängt, wenn der Name bereits existiert?

Das: 's-ä-ae-g;s-ö-oe-g;s-ü-ue-g;s-Ä-Ae-g;s-Ö-Oe-g;s-Ü-Ue-g;s-ß-ss-g' kann man an den rename-Befehl gleich anhängen:

find -execdir rename -n 's/[\001-\040]/_/g;s-ä-ae-g;s-ö-oe-g;s-ü-ue-g;s-Ä-Ae-g;s-Ö-Oe-g;s-Ü-Ue-g;s-ß-ss-g' {} ";"

rename muß vielleicht installiert werden - es müßte in einem Perlpaket sein. Sicher bin ich mit den Befehlen nicht; das '-n' steht für '-not really' und veranlaßt rename, nur auszugeben, welche Umbenennung vorgenommen werden würde.

Erst würde ich bei man mount schauen, ob nicht eine bessere Mountoption schon die meisten Probleme löst.

cornix Team-Icon

Avatar von cornix

Anmeldungsdatum:
9. März 2007

Beiträge: 4763

Wohnort: Ringenberg

user unknown schrieb:

rename muß vielleicht installiert werden - es müßte in einem Perlpaket sein.

Kleiner Exkurs "Aus welchem Paket kommt der Befehl x?":

cornix@c64:~$ which rename
/usr/bin/rename
cornix@c64:~$ file /usr/bin/rename
/usr/bin/rename: symbolic link to `/etc/alternatives/rename'
cornix@c64:~$ file /etc/alternatives/rename
/etc/alternatives/rename: symbolic link to `/usr/bin/prename'
cornix@c64:~$ file /usr/bin/prename
/usr/bin/prename: a /usr/bin/perl -w script text executable # Aha!
cornix@c64:~$ dpkg-query -S /usr/bin/prename
perl: /usr/bin/prename

Gruß, cornix

dragnod0

(Themenstarter)

Anmeldungsdatum:
28. April 2008

Beiträge: 63

Es handelt sich dabei um eine Samba Freigabe (ursprünglich ext3) von meinem Fileserver. Der Charset ist ja automatisch auf UTF-8 eingestellt. So steht es jedenfalls in der Wiki zum samba client cfis.

Ja der Script fügt bei doppelten Dateinamen eine Zahl hinzu.

riffraff

Avatar von riffraff

Anmeldungsdatum:
1. Oktober 2006

Beiträge: 486

Wohnort: Im kühlen Norden

Ich möchte nicht pessimistisch sein, aber das, was "user unknown" geschrieben hat, nochmal unterstreichen.

Eigene Erfahrung: Mit einem schnell hingeschriebenen "auto_rename"-Skript, was auch auf "find", "print", while do... etc basierte, wollte ich alle Umlaute und Leerzeichen in meiner Musiksammlung entfernen.

Danach waren tausende Titel völlig vergrützt - heute habe ich noch USB-Sticks im Auto, bei denen die Namen völlig zerfetzt sind - total ärgerlich und hochnot-peinlich ☺

Wenn Du das laufen lässt, würde ich sicherheitshalber, entweder den ganzen Schmonz vorher einmal ver-taren, sichern, backuppen.

Oder zumindest ein "find . -type f -exec cksum {} \; >> Checksummen_File.txt" drüberlaufen lassen, damit man später - FALLS ES SCHIEFGEHT - die Namen anhand der Checksummen wieder herstellen kann. (Oder eine Liste mit "tree" erzeugen, aber ich finde die cksum-files funktionieren ganz hervorragend - weil man den Inhalt auch wiederrum gut verscripten kann)

/EDIT: Achso zum Syntaxfehler.... da fehlt ein Semikolon vor dem "do" (while read fn; do....)

Oder einfach ein "ENTER" hinter dem fn

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}



also das ganze Zeug mal etwas besser formatieren und schon läuft das....

/EDIT-2: Ahc so, ja - das Script benennt nicht nur Dateinamen um, sondern auch Verzeichnisnamen - um das mal erwähnt zu haben....

riffraff

Avatar von riffraff

Anmeldungsdatum:
1. Oktober 2006

Beiträge: 486

Wohnort: Im kühlen Norden

...ups...Server-Timeout und hier war ein doppelter Post....

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

1
2
3
           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 ' kann man durch ; ersetzen.

Antworten |