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

Re: Mythtv-Dateien nach ihrem Symlink umbennen





Le 02/12/2018 à 16:33, Stefan Krusche a écrit :
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:

Was meinst du damit?

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.

Habe ich gemacht:
#/bin/bash -xv

zeigt aber nichts an.


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

Happy hacking,
Stefan


Hallo Stefan und Liste,

vielen Dank für die Erläuterungen, ist mir aber noch zu hoch.

Die von mythlink in "show_names" erstellten Dateien kann ich nach meinem Gusto bearbeiten, das ist nicht das Problem. Ich arbeite also mit einem vereinfachten Beispiel:

ls /home/klaus/todo/tv/rename
aufnamen  kurznamen

ls /home/klaus/todo/tv/rename/aufnamen
film1blabla.mpg  film2toctoc.mpg  film3truchouette.mpg

ls /home/klaus/todo/tv/rename/kurznamen/
film1.mpg  film2.mpg  film3.mpg

Aus den Symlinks habe ich zwecks Vereinfachung mit "touch" reale Dateien erstellt und die Symlinks gelöscht.

Ich möchte jetzt folgendes Ergebnis haben:

ls /home/klaus/todo/tv/rename/aufnahmen
film1.mpg  film2.mpg  film3.mpg



Gruß

Klaus









Reply to: