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.