Symolic Links aufspüren

  • Hi,


    geht es irgendwie, daß ich meine /video1 Partition durchsuche nach allen 0*.vdr Dateien, auf die keine Soft-Links von /video0 aus verweisen?


    Geht das vielleicht irgendwie - ich habe schon magische Sachen gesehen mit dem "|" Operator gesehen :), kenne mich aber mit Linux einfach zu wenig aus.


    danke

  • Hi,


    das Problem hierbei ist, dass eine Datei nichts davon weiß, wenn auf sie verlinkt wird. Du musst also video0 nach Symlinks auf video1 durchsuchen, und dann das Ergebnis vom Inhalt von video1 "abziehen".


    Etwa so:

    Code
    find /video0 -name 0*.vdr -type l -exec ls -Ll {} \;>/tmp/vid0
    find /video1 -exec ls -l {} \;>/tmp/vid1
    diff /tmp/vid0 /tmp/vid1


    So sollte es in etwa gehen.


    HTHH
    Jürgen :)

  • Cool - vielen Dank.


    Ich bin auch schon diesem Ansatz hinterhergegangen eine Liste der symbolic Links zu erstellen und dann eine Liste aller vdr Files aus der fraglichen Partition zu erstellen. Dann schaut man sich jedes Element der vid1 Liste an und löscht alle vorkommen von diesem kompletten Pfad in vid0.


    Das Hauptproblem ist IMHO - und wenn ich mich nicht irre auch bei der Lösung in Zeile 1 so, daß man ja nicht die Symbolic Links braucht, sondern den Pfad auf den die verweisen, oder?


    danke schonmal. Nach langem wühlen in den Manpages bin ich aber noch nicht darauf gekommen, wie man zu einem Softlink den Pfad anzeigen kann.

  • Geht das überhaupt auf Script/Shell Ebene?


    Ich habe zahlreiche Man Pages gelesen, aber nichts finden können. Wenn ich einen Pfad auf eine Datei bzw. einen SoftLink habe, möchte ich, daß man den Pfad der Datei auf den der Link zeigt zurückgegebn bekommt.


    Wenn das auf der Ebene gar nicht gehen sollte - kann ich mir eigentlich nicht vorstellen. Würde ich zum ersten Mal unter Linux versuchen, ob ich mit vi etwas hinbekomme, was gcc fressen will. Habe noch nie für Linux was programmiert, aber da *muß* es ja gehen...


    Vielleicht kann man ja aber die Welt davor verschonen :D

  • Servus,


    Zitat

    Geht das überhaupt auf Script/Shell Ebene?


    Natürlich!


    Zitat

    Ich habe zahlreiche Man Pages gelesen, aber nichts finden können.


    Dann war die Suche nicht intensiv genug :D


    Zitat

    Wenn ich einen Pfad auf eine Datei bzw. einen SoftLink habe, möchte ich, daß man den Pfad der Datei auf den der Link zeigt zurückgegebn bekommt.


    ... was genau der Befehl "readlink" für dich tut.


    Wenn du also alle Dateien brauchst, auf die Symlinks mit dem Namen "0??.vdr" verweisen, dann nimmst du einfach

    Code
    find /video0 -type l -name 0??.vdr -exec readlink {} \;


    und tust das irgend wo hin -- z.B. innerhalb eines Bash-Scripts in einen Array. Jetzt holst du dir mit

    Code
    find /video1 -type f -name 0??.vdr

    noch alle Video-Dateien aus /video1 und schaust einfach, ob es diese Datei bereits im Array gibt. Gibt es die Datei nicht, tust du sie mit "echo" rausgeben und fertig.


    Viele Grüße, Mirko

  • Sehr schön - wie immer mein Problem mit den Man-Pages und so ziemlich allem. Wenn man weiß,wo man suchen muß ist es gleich viel leichter :)


    Ich habe jetzt mein erstes Script dieser Art hinbekommen. Allerdings ist es seeehr langsam. Es braucht ungefährt 3 Min. bis es alle Files ausgegeben hat.


    Dabei ist das erstellen der beiden Listen eine Sekundensache.


    Ich habe es jetzt so gemacht, daß ich zwei verschachtelte Schleifen habe und dann einige Male mit test Abfrage.


    Das durchlaufen durch die beiden Arrays braucht enorm viel Zeit. Gibt es nicht eine Möglichkeit einen Array vom anderen Abzuziehen, Schnittmengen zu bilden o.ä.?


    don't get me wrong - ich bin froh das es funktioniert nur jetzt interessiert mich, wie man es optimieren könnte.

  • Ahoi,


    Zitat

    Wenn ich einen Pfad auf eine Datei bzw. einen SoftLink habe, möchte ich, daß man den Pfad der Datei auf den der Link zeigt zurückgegebn bekommt.


    ... was genau der Befehl "readlink" für dich tut.


    das war eigentlich das, was ich mit dem "ls -lL" bezwecken wollte. Funzt leider nicht so, wie Du auch richtig bemerkt hast. Sorry. Ich gestehe, ich hab´s auch nicht ausprobiert (schäm).
    Aber readlink ist ja Dein Freund (den kannte ich auch noch nicht)


    Ciao
    Jürgen :)

  • Zitat

    Ich habe jetzt mein erstes Script dieser Art hinbekommen. Allerdings ist es seeehr langsam. Es braucht ungefährt 3 Min. bis es alle Files ausgegeben hat.
    Ich habe es jetzt so gemacht, daß ich zwei verschachtelte Schleifen habe und dann einige Male mit test Abfrage.


    Bist du sicher, dass du mit Arrays arbeitest??? Das hört sich eher so an, als ob du dutzende Male "find" laufen lässt. Das ist natürlich overkill!
    Das Durchmustern von Arrays ist in Bruchteilen von Sekunden erledigt.


    Viele Grüße, Mirko

  • Bin mir relativ sicher, das das nicht :)


    Dies habe ich "produziert"

    Wie gesagt - sehr lange Laufzeit. Das Einlesen der Arrays geht sehr Fix, aber dann Feld auf Feld zu überprüfen. Aktuell ist es so, daß für jedes Videofile unter allen softlinks nachgeschaut wird, ob dieser dazugehört. Man könnte evtl. optimieren, daß man einen gefunden Softlink/Zuordnung aus dem Array löscht damit er beim nächsten Mal nicht mehr beachtet werden muß.


    Allerdings wie effizient wäre dies? (also in der Regel mit dem letzten Tauschen und die Kapazität um 1 verringern)

  • Könnte das mal jemand erweitern, ich habe hier video0, video1 und video2 etc.pp.


    Danke :)

    Gruß hgm.bg


    -----------------------------
    Fedora Core 3 / Athlon XP 2400 512MB
    2x Nexus 2.1 + 1xCI + 1xBudget + Alphacrypt
    VDR 1.3.41 + VDRconvert

  • Servus,


    Zitat

    Dies habe ich "produziert"


    Eieiei... naja, hauptsache funktioniert :D


    Bei mir ist tatsächlich die Lösung ohne Array schneller als die mit (0,75s gegenüber 1,05s), also hier mal das optimierte Script, das auch /video0 bis /video9 mit abdeckt:


    Viele Grüße, Mirko


    P.S: Kleiner Bash-Kurs gefällig?
    http://www.linux-user.de/ausga…042-pcorner/pcorner7.html, die vorangehenden 6 Teile sind ebenfalls dort online.

  • Sehr schön - vielen Dank.


    Habe eben Mal ein "Benchmark" gestartet - es ist ziemlich genau 100x schneller :) vorher 7min14sec - jetzt 7sec (EDIT: bzw. 62x mal schneller - war schon etwas spät :) )


    Mir war auch nicht bewußt, daß ich durch die Ausgabe zeilenweise durchlaufen kann. Aber am Meisten zeit, hat doch diese exzessive Verwendung von test gebracht, oder?


    Den Bash-Kurs gucke ich mir gerade mal an - Danke


  • Hi Mirko,


    dein Skript geht bei mir nicht, ich musste noch einen abschliessenden Slash (/) im find eintragen und dann ging es, ich weiss nicht, ob das an meinem FIND liegt, aber so funzt es bei mir und danke für dein Skript (habe wenigstens 1 Leiche gefunden :) )


    Gruß hgm.bg


    -----------------------------
    Fedora Core 3 / Athlon XP 2400 512MB
    2x Nexus 2.1 + 1xCI + 1xBudget + Alphacrypt
    VDR 1.3.41 + VDRconvert

  • Servus,


    Zitat

    dein Skript geht bei mir nicht, ich musste noch einen abschliessenden Slash (/) im find eintragen und dann ging es, ich weiss nicht, ob das an meinem FIND liegt


    Nein, es liegt daran, dass du offenbar (wieso blos???) Symlinks für /video* benutzt.


    Viele Grüße, Mirko

  • Okay, das stimmt, warum ? Naja, so kann ich meine Platten hin und herhängen wie es mir beliebt. War in letzter Zeit öfters fällig.
    Trotzdem Danke für dein Skript !!

    Gruß hgm.bg


    -----------------------------
    Fedora Core 3 / Athlon XP 2400 512MB
    2x Nexus 2.1 + 1xCI + 1xBudget + Alphacrypt
    VDR 1.3.41 + VDRconvert

  • ALso,


    wenn ich das hier alles richtig verstanden habe sucht ihr mit dem Script nach *.vdr-Dateien auf die noch nicht verlinkt worden ist. Bedeutet dann aber, dass man im Anschluß die fehlenden Links alle von Hand nachziehen muß.


    Mein Problem ist z.Zt. dass ich meine Aufzeichnungen von mehreren Partitionen jetzt auf zwei Platten (/video1 und /video2) zusammen geschoben habe, und nun in /video0 die notwendigen (alle!) Links erzeugen muß. Insbesondere muß ich ja nun die Verzeichnisstruktur der /video1 und /video2 Partition nachbilden auf /video0, und ich kenne nur den einfachen manuellen Weg.
    Also mkdir /Filmname, dann cd /Filmname und dann mkdir 2004-.....50.50.rec, dann ln -l /video1/..... 001.vdr 001.vdr usw ...


    Geht das nicht einfacher??? (ist bei gut 300GB Material nämlich ein haufen gelinke ...)

    VDR 1.4.6 Duron 1300 - 736 MB Ram - 4*160GB Samsung SP1604N - 2*160GB WD - 1*400GB Samsung - 1*500GB WD - 1*Nexus Rev.2.1 - 1*NovaSE

  • Servus,


    Zitat

    wenn ich das hier alles richtig verstanden habe sucht ihr mit dem Script nach *.vdr-Dateien auf die noch nicht verlinkt worden ist.


    Genauer auf solche Dateien, die nicht mehr verlinkt sind, also zu keinem Recording gehören und deshalb gelöscht werden können.


    Zitat

    Bedeutet dann aber, dass man im Anschluß die fehlenden Links alle von Hand nachziehen muß.


    Nein, das bedeutet, dass du sie löschen kannst. Sie sind eh nur noch Leichen.


    Zitat

    Mein Problem ist z.Zt. dass ich meine Aufzeichnungen von mehreren Partitionen jetzt auf zwei Platten (/video1 und /video2) zusammen geschoben habe, und nun in /video0 die notwendigen (alle!) Links erzeugen muß.


    Logisch, die Symlinks stimmen ja nicht mehr.


    Zitat

    Insbesondere muß ich ja nun die Verzeichnisstruktur der /video1 und /video2 Partition nachbilden auf /video0, und ich kenne nur den einfachen manuellen Weg.


    Verstehe ich nicht. Es reicht, wenn du die Symlinks in /video0 umbiegst, die ja noch auf /video8 und /video9 zeigen. In /video0 hat sich ja nichts verändert, oder?


    Ansonsten kannst du sowas natürlich immer Scripiten, entsprechende Kenntnisse vorausgesetzt. Die Bash kann auch ohne Probleme mit Regular Expressions umgehen, da brauchst du nicht mal ein externes Programm.


    Zitat

    Also mkdir /Filmname, dann cd /Filmname und dann mkdir 2004-.....50.50.rec, dann ln -l /video1/..... 001.vdr 001.vdr usw ...


    Geht das nicht einfacher???


    Äääähm, wie wär's mal mit "man mkdir"? Dann würde dir sicher der Parameter "-p" auffallen...


    Viele Grüße, Mirko

  • Hi Mirko,


    kannst Du dein Skript so ergänzen, dass die gefundenen Dateien gleich gelöscht werden ?


    Bei mir haben sich schon einige Hundert Leichen angesammelt und es wäre mühselig das von Hand zu erledigen.


    Dann müsste man auch noch leere Unterverzeichnissse löschen.


    Das Skript könnte man dann nach dem Skript laufen lassen das die *.del Verzeichnisse löscht, dann wäre der VDR wirklich aufgeräumt.


    Grüße Bernd



    PS.: Und vielen Dank für LinVDR 0.7, ich werds morgen testen

    VDR : POV Atom 330-1 Mainboard, MSI TV@nywhere Satellite II, 2 GB RAM, natürlich mit yaVDR 0.61. Heimkino mit Onkyo AVR, Nubert-Surround-Boxen und JVC Beamer mit 4K und HDR. HD-VDR für Newbies: www.partyfotos.de/vdr

  • Servus Bernd,


    Zitat

    kannst Du dein Skript so ergänzen, dass die gefundenen Dateien gleich gelöscht werden ?


    Nein. Weil ich keine Lust habe, dass irgend wann mal kommt und sich beschwert, weil durch mein Script plötzlich alle Recordings oder ganze Platten weg waren.


    Wir schießen hier mit einem 100-Millimeter-Geschütz auf einen großen Erbsenhaufen und hoffen, dass nur die schlechten Erbsen mitten drin bei drauf gehen.


    Du kannst statt "echo $f" im Script ein "rm -fR $f" einbauen, aber wie gesagt, auf eigene Gefahr.


    Viele Grüße, Mirko

  • *lach*


    genau das wollte ich verhindern, dass nämlich alles gelöscht wird.


    Wie soll ich von den 500 GB ein Backup anlegen ?


    dann mach ichs doch manuell, bzw. mit einem manuell erstellen Skript.

    VDR : POV Atom 330-1 Mainboard, MSI TV@nywhere Satellite II, 2 GB RAM, natürlich mit yaVDR 0.61. Heimkino mit Onkyo AVR, Nubert-Surround-Boxen und JVC Beamer mit 4K und HDR. HD-VDR für Newbies: www.partyfotos.de/vdr

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!