[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Mythtv-Dateien nach ihrem Symlink umbennen



Hallo Klaus,

mir ist nicht ganz klar, wie Du Dir den Arbeitsablauf Deines Skriptes 
vorstellst, aber ein paar Dinge fallen mir auf. S.u.

Am Sonntag, 2. Dezember 2018 schrieb Klaus Becker:
> Ich möchte also den Dateien ihren wirklichen Namen geben, den man dank
> mythlink in "show_names" findet, z. B. "film1.mpg", "film2.mpg",
> "film3.mpg".
>
> Ich habe bereits vergeblich versucht, mir ein kleines Skript dafür zu
> basteln:
>
> =========
> langname=$(ls *.mpg)

Das sieht mir so aus, als würde eine Liste von Dateinamen als eine 
Zeichenkette in "$langname" gespeichert werden (vorausgestetzt, keiner der 
Dateinamen enthält Leerzeichen, Zeilenumbrüche oder Tabs)

Davon abgesehen, siehe: http://mywiki.wooledge.org/ParsingLs

> kurzname=$(readlink ../kurznamen/*.mpg)

Hier scheint mir wieder eine Liste von Dateinamen in "$kurzname" gespeichert 
zu werden.

Falls Du andererseits _einen_ Dateiname ohne Stern an readlink übergibst, 
dann wird die Ausgabe von readlink vermutlich den absoluten bzw. relativen 
Pfad enthalten, auf den der symlink verweist, müßte also noch einmal 
verarbeitet werden, damit Du den Basisnamen der Datei erhältst; ansonsten 
würde versucht, die Datei umzubenennen in den Dateinamen des Ziels des 
symlinks, das ja schon (vermutlich?) existiert, wäre also auch eine 
Erklärung für die von Dir berichtete Fehlermeldung.

Z.B.:

  kurzname="${kurzname##*/}"

Siehe dazu parameter expansion in man bash.
Oder:
http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion
Besonders das könnte in Deinem Fall helfen:
http://mywiki.wooledge.org/BashFAQ/030

> for file in *.mpg;do
>          mv $file $(echo $file | sed s/\$langname/\$kurzname/)

Hier liegt vermutlich der Fehler, den Du beobachtest: der sed Aufruf sucht 
nach dem Inhalt von "$langname" (einer Liste von Dateinamen) in stdin, der 
von echo "$file" kommt, findet also *nie* irgendetwas, das ersetzt werden 
kann, da "$file" nur einen Dateinamen enthält (oder Teile davon, falls ein 
Dateiname Leerzeichen usw. enthält), so daß die Ausgabe der subshell 
dasselbe bleibt wie "$file". Dann die entsprechende Fehlermeldung von mv.

Wie wäre es mit etwas wie dem folgenden:

for Datei in *.mpg; do
  # in die folgende subshell müßte der richtige Kode rein, der den
  # gewünschten Dateinamen extrahiert/ermittelt, hier nur angedeutet, um die
  # Idee zu vermitteln, da ich mythlink nicht kenne,
  NeuName=$( mythlink show_names "$Datei" )
  mv "$Datei" "$NeuName"
done

Oder, falls es nur um den symlink geht:

for Datei in *.mpg; do
  NeuName=$(readlink "$Datei")
  NeuName="${NeuName##*/}
  mv "$Datei" "$NeuName"
done


> done
> =========
>
> Ergebnis:
>
> mv: 'film1blabla.mpg' und 'film1blabla.mpg' identifizieren die gleiche
> Datei mv: 'film2toctoc.mpg' und 'film2toctoc.mpg' identifizieren die
> gleiche Datei
> mv: 'film3truchouette.mpg' und 'film3truchouette.mpg' identifizieren die
> gleiche Datei

Wenn Du in Deinem Skript dem Shebang die Optionen -xv (für bash) hinzufügst, 
kannst Du nachvollziehen, wie jede Zeile Deines Skriptes verarbeitet wird.

Hoffe, daß das hilft oder zumindest Denkfutter ist :-)

Happy hacking,
Stefan


Reply to: