Hallo user_unknown,
danke für die schnelle Antwort.
Ich dachte mir bereits, dass jemand fragen würde. Mein Konstrukt ist etwas kompliziert, weil ich mich an die Gewohnheiten mehrerer Personen anpassen muss. Ich versuchs mal zu erklären.
Inhaltlich geht es darum, meine Filme, die auf mehreren Platten liegen (insgesamt 10TB), intelligent in einen Verzeichnisbaum zu verlinken. Gelayerte Dateisysteme hatte ich bereits probiert, aber wieder abgeschafft, weil ich zu viele Probleme hatte, als ich Platten austauschen musste. Außerdem arbeiten gelayerte Dateisysteme so, dass sie Dateien aus dem unteren Dateisystem in das Workdir kopieren, wenn auf sie zugegriffen wirrd. Das bringt die Performance komplett in den Keller, wenn es um große Dateien geht und verschwendet viel Speicherplatz.
Dabei ist eine meiner Platten 99,5% voll, read-only eingebunden und die andere wird gerade gefüllt. Der Verzeichnisbaum ist auf beiden Platten identisch vorhanden und verändert sich nicht mehr (Alphabetische Ablage.)
Ich habe ein Script entworfen (von dem hier allerdings noch nicht die Rede war, dass grundlegend so arbeitet, dass die beiden Platten mit ihren identischen Verzeichnisbäumen an einer dritten Stelle über Symbolische Links in einen dritten Verzeichnisbaum identischer Struktur zusammengefügt werden. Das geschieht vollautomatisch, und wartungsfrei. Neuanlage, Löschung und Namensänderung sind als Use-cases abgefrühstückt und das Look & Feel ähnelt dadurch stark einem gelayerten Dateisystem.
Es gibt vier grundlegende Ablageregeln:
Alles(!) wird nach bestimmten Vorgaben alphabetisch abgelegt (Neue Files werden im Original zunächst auf der zweiten Platte abgelegt. Das geschieht immer in ein Download-Verzeichnis und ist ein manueller Prozess).
Alle Files werden von lnk später anhand des Namens in weiteren Verzeichnisstrukturen verlinkt. Dabei gibt es einen Bereich, in dem nach bestimmten Kategorien (z.B. Dokus, Wissenschaftliche Filme, Sachen für Kinder, Serien, Filme...) sortiert wird, und einen weiteren Bereich, in dem nach Themen sortiert wird ( Mauerfall, Geschichte des 30 jährigen Krieges...). Darüberhinaus lege ich eine besondere Kategorie "Noch nicht gesehen" an, in der nur steht, was noch nicht gesehen wurde.
Reihen und Serien werden nicht alphabetisch abgelegt, sondern nach Serientitel, im Namen des Files werden dann die Staffel und Folge in "Kodi-Manier" kodiert. (Beispiel: Die Folge "Klassentreffen" aus der Serie "Doctor Who" ist Staffel 2, Folge 3. Das wird so benamt: "Klassentreffen S02E03.mp4", wobei die Benamung tatsächlich für Kodi ist, dazu später mehr.)
Auch eigene Videos vom Handy oder Cam finden in dieser Struktur Platz.
Später wird die thematische Ablage für Kodi aufbereitet (wieder eine eigene Verzeichnisstruktur, wieder ein neues Script, per cron ausgeführt), so dass Kodi aus der Verzeichnisstruktur seine eigenen Informationen errechnen kann. Kodi ist mir übrigens mit seiner Ausrichtung auf Filme und Serien zu unflexibel und man muss oft zu lange suchen, um an die richtigen Informationen zu kommen.
Bis hierhin ist das erprobt, und läuft seit mehr als zwei Jahren stabil auf meinem Server. Einzig der Download, gefolgt von der Verlinkung sind zwei manuelle Schritte. Alles was ich downloade muss über lnk einsortiert werden (lnk kann übrigens mit Wildcards umgehen).
Datei aus dem Netz (Internet-Videorecorder) herunterladen und dabei nach meinen Wünschen benamen (Dokus erhalten z.B. immer das Tag ".doku" am Dateinamen, Serien bekommen "SxxExx" addiert.
lnk anwerfen und die Datei(en) einsortieren
Das sieht also so aus:
Datei wurde z.B. als "Klassentreffen S02E03.mp4" im Download Ordner abgelegt, und ist eine Folge aus der Serie Doctor Who.
Mit
| lnk -nza 12 -S 'Doctor Who' "Klassentreffen S02E03.mp4"
|
geschieht folgendes:
Die Datei wird alphabetisch in den Unterverzeichnisbaum ".../Ablage/Alphabetisch/Serien/Doctor Who" verschoben.
Danach wird ein Link im Verzeichnis "Neu" zur Datei angelegt (Option -n)
Es wird ein Link im Unter-Verzeichnisbaum SF angelegt (Option -z). Ist eigentlich noch komplizierter, denn auch hier wird alphabetish untersortiert, aber das soll hier egal sein.
Es wird ein Link im Verzeichnis 12 unter Alterseignung angelegt.
Vielleicht wird nun deutlich, warum ich mich nicht mit der Frage herumschlagen möchte, wohin die einzelnen Symlinks gehören.
Wie gesagt, hatte ich mir überlegt, dass ich mir den Schritt "lnk anwerfen und die Datei(en) einsortieren" sparen kann, wenn ich bei der sowieso notwendigen Benamung beim Download die Optionen im Dateinamen mit angebe. Lasse ich cron ein weiteres Script ausführen ( das erwähnte autolnk) dann kann dieses Script die Dateinamen auswerten, und lnk für jede Datei mit den passenden Optionen aufrufen.
autolnk funktioniert auch bereits gut, wenn da nicht die Option -S wäre, die eben manchmal ein Argument in Quotes braucht. Übrigens kann ich nicht mit maskierten Sonderzeichen arbeiten, denn die funktionieren zwar auf der Kommandozeile als Dateinamensbestandteil, bringen aber in der Ubuntu GUI nur Verdruß.
Wüßte ich also, wie ich mit den Quotes umgehe, könnte ich komplett auf den Aufruf der Shell verzichten. Da die Daten auf dem Server liegen, muss ich mich für den Aufruf von lnk nämlich jedesmal per ssh auf den Server verbinden.
Ok, ich bin Dir noch den Code aus lnk schuldig, der zum Fehler führt. Ich habe testweise ein echo nach der Auswertung der Optionen in lnk eingefügt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | while getopts :a:bcdDhkmnp:R:sS:vVwxz option
do
case "${option}"
in
# Schnipp
S) Serie=true
SerienName=${OPTARG};;
# Schnapp
esac
done
# Shift off the options and optional --.
shift "$((OPTIND-1))"
echo $SerienName
|
Folgendes ergibt sich als Ausgabe:
Von Kommandozeile aufgerufen wertet lnk die Option korrekt aus
| [root@sme3 Downloads]lnk -S '4 Blocks' <SchnippSchnapp>/Downloads//test.mp4
4 Blocks # per echo von lnk ausgegeben.
|
Jetzt der Aufruf über autolnk
| [root@sme3 Downloads]# autolnk
Mon Sep 2 09:07:53 CEST 2019, autolnk: Start
Mon Sep 2 09:07:55 CEST 2019, autolnk: Umbenennen: <SchnippSchnapp>/Downloads//test[-S '4 Blocks'].mp4 in .../Downloads//test.mp4
Mon Sep 2 09:07:55 CEST 2019, autolnk: Verlinken: lnk -S '4 Blocks' <SchnippSchnapp>/Downloads//test.mp4
'4 # aus autolnk kommt nur der Teil bis zum Leerzeichen an. Das Hochkomma wird als Zeichen betrachtet!
Mon Sep 2 09:07:55 CEST 2019, lnk: Error: Ziel ist kein Verzeichnis. Scriptende (exit -4)
Mon Sep 2 09:07:55 CEST 2019, autolnk: Ende
|
(Die Zeilen mit den Datumstags stammen von einer Log-Funktion, die ich aufrufen kann, wenn ich debuggen will.)
Innerhalb von autolnk wird der Code aufgerufen, den ich bereits im ersten Post genannt habe:
| /usr/local/bin/lnk $OptStr "$RestStr"
|
Also bleibt meine Frage: Wie muss ich die Option an lnk durchreichen, damit sie korrekt ausgewertet werden kann? Alles andere funktioniert ja gut.
Notfalls würde mir auch ein Workaround genügen, aber ich bin eigentlich überzeugt, dass ich nur mit der shell kämpfe.