staging.inyokaproject.org

Schleife zum Erstellen von nfo-Dateien

Status: Gelöst | Ubuntu-Version: Kubuntu 14.04 (Trusty Tahr)
Antworten |

MaxPowers82

Anmeldungsdatum:
11. November 2006

Beiträge: 175

Hi, ich bin gerade daran gescheitert eine bash-script zu erstellen, dass nfo-Dateien für unsere Urlaubsfilme erzeugt, da xbmc/kodi sie ansonsten nicht automatisch auflistet.

Das Script soll in den Video-Ordnern jeden dahinter liegenden Unterordner öffnen und in diesem eine nfo-Datei mit dem Namen der Videodatei erstellen. Hier der Ansatz :

1
2
3
4
5
6
7
8
9
for $name in $( ls -d */ ); do #Schleife
cd $name
echo "<movie>" > test.nfo
echo "<title> $Name </title>" >> test.nfo
echo    "<genre> UrlaubXY </genre>" >> test.nfo
echo  "<sorttitle> $Name </sorttitle>" >> test.nfo
echo "</movie>" >> test.nfo
cd ..
done

Nur $Name muss jeweils nach der *.mov oder *.avi Datei angepasst werden.

Wie mache ich das am einfachsten ?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

MaxPowers82 schrieb:

Das Script soll in den Video-Ordnern jeden dahinter liegenden Unterordner öffnen und in diesem eine nfo-Datei mit dem Namen der Videodatei erstellen.

Ist denn in jedem Ordner nur eine Datei? Was machst Du, wenn dort mehrere Video-Dateien liegen? Hast Du nur eine Ebene von geschachtelten Ordnern oder ist die Hierarchie beliebig tief? Im letzteren Fall nimmt man besser find zu Hilfe.

Nur $Name muss jeweils nach der *.mov oder *.avi Datei angepasst werden.

Was soll das genau bedeuten? Willst Du einfach die Erweiterung abschneiden? Willst Du ihn aus den Meta-Daten in der Datei lesen?

Wie mache ich das am einfachsten ?

<streng-guck>Du benutzt erst mal nicht ls um eine Dateiliste für die Shell zu erstellen.</streng-guck> Dann musst Du die Variable im Schleifenkopf genau so schreiben wie im Rumpf. $name und $Name sind zwei unterschiedliche Variablen für die Shell.

Zum Schreiben der Datei würde ich ein Here-Document nutzen. Dann sparst Du Dir die ganzen echo-Befehle.

Ciao

robert

MaxPowers82

(Themenstarter)

Anmeldungsdatum:
11. November 2006

Beiträge: 175

Danke für die schnelle Antwort. Zu deinen Fragen:

Hast Du nur eine Ebene von geschachtelten Ordnern oder ist die Hierarchie beliebig tief?

Ich habe nur eine Ebene

Ist denn in jedem Ordner nur eine Datei? Was machst Du, wenn dort mehrere Video-Dateien liegen?

In jedem Ordner sollte nur eine Videodatei liegen, außerdem manchmal Textdateien mit Infos wo wir das gefilmt haben. Komplett sicher bin ich mir nicht, ob überall nur eine Videodatei liegt. Notfalls könnte man den Namen der ersten Videodatei oder den (meist identischen) Namen des Unterordners in dem die Dateien liegen nehmen.

Nur $Name muss jeweils nach der *.mov oder *.avi Datei angepasst werden.

Was soll das genau bedeuten? Willst Du einfach die Erweiterung abschneiden? Willst Du ihn aus den Meta-Daten in der Datei lesen?

Ich will der nfo Datei den selben Namen wie der Videodatei geben.

Das Script muss nicht großartig optimiert werden, da ich es wohl selten nutzen werde. Mein Problem ist,dass ich nicht verstehe wie man eine Schleife bauen kann die jedes Unterverzeichnis nacheinander öffnet, dort Befehle ausführt und zum nächsten Unterverzeichnis geht.

PS: Die Unterverzeichnisse haben teilweise Leerzeichen im Namen

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

rklm schrieb:

Dann musst Du die Variable im Schleifenkopf genau so schreiben wie im Rumpf. $name und $Name sind zwei unterschiedliche Variablen für die Shell.

Abgesehen davon, dass das Skript nicht funktioniert, wenn bei der Zuweisung des Wertes an die Variable (Zeile 1) das $-Zeichen benutzt wird. Das müsste doch eigentlich

1
for name in $( ls -d */ ); do #Schleife

heißen, natürlich ohne das böse ls in der Zuweisung.

Darüber hinaus: wenn man das mit echo machen will, dann ist das doch ein Paradefall für

1
exec > test.nfo

zu Beginn des Skripts, dann braucht man die Umleitungen in den einzelnen Zeilen nicht mehr.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

MaxPowers82 schrieb:

Ist denn in jedem Ordner nur eine Datei? Was machst Du, wenn dort mehrere Video-Dateien liegen?

In jedem Ordner sollte nur eine Videodatei liegen, außerdem manchmal Textdateien mit Infos wo wir das gefilmt haben. Komplett sicher bin ich mir nicht, ob überall nur eine Videodatei liegt. Notfalls könnte man den Namen der ersten Videodatei oder den (meist identischen) Namen des Unterordners in dem die Dateien liegen nehmen.

Du musst das entscheiden. Dein Programm wird mit "könnte" nicht umgehen können. ☺

Nur $Name muss jeweils nach der *.mov oder *.avi Datei angepasst werden.

Was soll das genau bedeuten? Willst Du einfach die Erweiterung abschneiden? Willst Du ihn aus den Meta-Daten in der Datei lesen?

Ich will der nfo Datei den selben Namen wie der Videodatei geben.

Es ging ja hier um den Namen, der in die Datei geschrieben wird.

Mein Problem ist,dass ich nicht verstehe wie man eine Schleife bauen kann die jedes Unterverzeichnis nacheinander öffnet, dort Befehle ausführt und zum nächsten Unterverzeichnis geht.

PS: Die Unterverzeichnisse haben teilweise Leerzeichen im Namen

Das ist relativ einfach: Du kannst eine Subshell nutzen, dann brauchst Du den cd .. nicht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
for d in */; do
  (
    cd "$d"
    
    for f in *.mov *.avi; do
      if [ -f "$f" ]; then
        cat >"${f%.*}.nfo" <<DATA
$f
DATA
        exit
      fi
    done
  )
done

WinXP to Edgy schrieb:

rklm schrieb:

Dann musst Du die Variable im Schleifenkopf genau so schreiben wie im Rumpf. $name und $Name sind zwei unterschiedliche Variablen für die Shell.

Abgesehen davon, dass das Skript nicht funktioniert, wenn bei der Zuweisung des Wertes an die Variable (Zeile 1) das $-Zeichen benutzt wird.

Jau! War mir gar nicht aufgefallen.

Darüber hinaus: wenn man das mit echo machen will, dann ist das doch ein Paradefall für

1
exec > test.nfo

zu Beginn des Skripts, dann braucht man die Umleitungen in den einzelnen Zeilen nicht mehr.

Nee, es sollen ja mehrere nfo-Dateien erzeugt werden.

Ciao

robert

Bleys

Anmeldungsdatum:
13. August 2006

Beiträge: 6172

Falls Du diese Übung nicht nur machst um Scripten zu lernen solltest Du Dir mal den TiniMediaManager ansehen.

Seit diesem Tool bearbeite ich alle meine Media Dateien damit und in Kodi stehen alle Quellen auf "Local Information only"

MaxPowers82

(Themenstarter)

Anmeldungsdatum:
11. November 2006

Beiträge: 175

Danke rklm, hab das Thema offensichtlich bis zum nächsten Urlaub verschoben.

Mein Script ist jetzt so angepasst, dass der Ordnername und nicht der Dateiname genommen wird. Um einen kompletten Ordner einem Urlaub zuzuordnen habe ich das Genre außerdem über das Script übergeben lassen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#! /bin/bash
echo Genre angegeben ?
for d in */; do
  (
    cd "$d"
    echo ${d%/} #nur zur Info
    rm *.nf*
    cat >"${d%/}.nfo" <<DATA
<movie>
<title>${d%/} </title>
<genre>$1</genre>
<sorttitle>${d%/}</sorttitle>
<set>$1</set>
</movie>
DATA
exit

  )
done

Man könnte noch ein bisschen mehr machen, aber so oft benötige ich es nicht.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

MaxPowers82 schrieb:

Danke rklm,

Bitte.

Man könnte noch ein bisschen mehr machen, aber so oft benötige ich es nicht.

Oder auch weniger: der exit in Zeile 16 ist überflüssig. ☺

Antworten |