Linux: kopieren einer Verzeichnisstruktur INKL. Dateinamen - ohne Inhalt .....

  • Hallo,


    habe gerade ein Problem - und mag da ungerne was für Programmieren (sehe da ein Problem drinnen ... ;)


    Ich möchte eine grosse Verzeichnisstruktur inkl. Dateinamen UND inode-links kopieren - jedoch keine Dateninhalte.

    Könnte nun einfach ein find laufen lassen, damit die Verzeichnisstruktur erstellen - ein zweites find um damit dann per touch Dateien zu erzeugen, jedoch habe ich dann die Hard-Link Informaionen, die ich bei der kopie brauche, verloren ... :/

    (Von Datenträger A nach Datenträger B)


    Hat da wer eine Idee?

    Axel

  • Du sprichst von Hardlinks und verschiedenen Datenträgern. Das schließt sich aus. Willst du Softlinks erzeugen oder leere Dateien auf dem Zieldatenträger?

    Das Genie beherrscht das Chaos

  • Mit GNUTar könnte das gehen. Wie gewohnt einpacken, dann auspacken auf dem Ziel mit


    "-tocommand=truncate -s0"


    Hat halt den Nachteil, dass das Archiv wirklich alle Daten enthält, die nur beim Auspacken geleert werden.

  • Ich möchte ein Kopie der Verzeichnis und Dateistruktur erstellen, ohne den Inhalt der Dateien zu haben.


    Dekay Der Find könnte sehr gut helfen. Da dann ein sort drüber und bei uniq inode ein ln statt ein touch ... und es wäre ein einfaches script ... :)

  • Mit GNUTar könnte das gehen. Wie gewohnt einpacken, dann auspacken auf dem Ziel mit


    "-tocommand=truncate -s0"


    Hat halt den Nachteil, dass das Archiv wirklich alle Daten enthält, die nur beim Auspacken geleert werden.

    Da liegt ja das Problem ..... 60TB will man nicht packen ;)

    • Offizieller Beitrag

    Ich möchte ein Kopie der Verzeichnis und Dateistruktur erstellen, ohne den Inhalt der Dateien zu haben.

    Jetzt bin ich immer noch neugierig: Wozu willst Du das machen? Was ist das Ziel der ganzen Aktion?


    Dekay Der Find könnte sehr gut helfen. Da dann ein sort drüber und bei uniq inode ein ln statt ein touch ... und es wäre ein einfaches script ... :)

    Also einen Hard Link auf eine leere Datei, die Du zuvor mit touch angelegt hast? Meinst Du das? Dann muss nur ERST die Datei angelegt worden sein und dann darf der "ln" kommen. Wenn die Dateiliste nicht so sortiert ist, dass erst alle Dateien und dann alle Hard Links des Verzeicnisses kommen, klappt das nicht.

    Denn Feindschaft wird durch Feindschaft nimmermehr gestillt; Versöhnlichkeit schafft Ruh’ – ein Satz, der immer gilt. Man denkt oft nicht daran, sich selbst zurückzuhalten; Wer aber daran denkt, der lässt den Zorn erkalten. Sprüche von Buddha, aus dem ‹Dhammapada›.


    Mein Netz: Acorn | Atari | Milan | Amiga | Apple //e und IIGS | Macintosh | SUN Sparc | NeXT |SGI | IBM RS/6000 | DEC Vaxstation und Decstation| Raspberry Pi | PCs mit OS/2, BeOS, Linux, AROS, Windows, BSD | Stand-alone: Apple //c und III | Commodore 128D | Sinclair QL | Amstrad | PDAs

  • Da liegt ja das Problem ..... 60TB will man nicht packen ;)

    Na, dann sag' das doch gleich...


    Auf manchen Linuxen ist cp mit einer Option --attributes-only verfübar. Damit kann man Dateien "ohne Inhalt" kopieren. Und weil cp Links mitnehmen kann, ist das möglicherweise ein Ansatz zur Lösung.


    Die dann möglicherweise so einfach wie


    Code
    cp -as --attributes-only SOURCE/ COPY

    sein könnte (nicht ausprobiert).

  • yalsi

    Über die Dateinamen und Hardlinks der 60 TB soll eine Datenbank aufgebaut werden. Da damit auch noch weiteres passiert, muss es was eigenes sein. Da das ein Produktivsystem ist brauche ich ein System zum simullieren des ganzen, welches dem original sehr nahe kommt. rsync -H würde das inkl. Hardlinks machen - jedoch, 'leider' auch inkl. der Daten, die nicht gebraucht werden ....

    Und es werden sehr viele Hardlinks verwendet.


    Der harte Teil wird dann sein alle Dateien mit Checksums zu versehen .....

  • Ich würde das ja mit find, sort und awk lösen.

    Also find /src/path -printf "%i %p" | sort | awk -f magic_script_with.awk

    In dem awk prüfst du halt auf einen Wechsel des inodes (erstes Feld) und tust dann Dinge :sunny:

    Das Genie beherrscht das Chaos

  • nalkem Keine manual pages installiert oder durchforstet? - Kann ich bei GNU/Linux verstehen. Da gibt es gegenüber dem ursprünglichen UNIX-Ansatz einfach zu viele Optionen. Da merke ich mir nicht mehr alle. Wundert mich, dass man Pipes nicht schon abgeschafft hat, wenn "alles" mit jedem Kommando geht :S

  • Das kann man z.B. mit star machen. Man erzeugt ein Archiv, das nur Metadaten enthält:

    Code
    star -cvf file.tar -meta dateien...

    und entpackt es dann mit -xmeta:

    Code
    star -xvf file.tar -xmeta

    Zum kopieren aller Dateien gibt man natürlich “.” für “dateien...” ein. Man kann auch beides in einen Befehl kombinieren. Dazu bewegt man sich ins Zielverzeichnis und tippert:

    Code
    star -cv -meta -C quellverzeichnis dateien... | star -x -xmeta

    Viel Erfolg!

  • gibt es gegenüber dem ursprünglichen UNIX-Ansatz einfach zu viele Optionen. Da merke ich mir nicht mehr alle. Wundert mich, dass man Pipes nicht schon abgeschafft hat, wenn "alles" mit jedem Kommando geht :S


    Wie würde man das denn auf einem "echten" UNIX machen ??


    Für die Directories würde mir da was einfallen, so daß man die Baumstruktur bekommt - und zwar als Kopie-Variante. ( mit find -type d ). Für einfache Dateien könnte ich mir was vorstellen, was so in die Richtung geht, wie nalkem das ganz oben vorschlägt - mit find und touch (da fehlen dann aber die Attribute, Rechte und so). Aber für Hardlinks ?? Die muß man doch irgendwie sammeln und auf der anderen Seite neu aufbauen.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Für den vorliegenden Anwendungsfall ist es eigentlich ziemlich irrelevant, ob man zwei unterschiedliche leere Files (keine Links) oder zwei verschiedene Directory-Einträge auf die gleiche leere Datei (echte hard links) hat. 0 ist eben 0.


    Will man tatsächlich hard links als hard links kopieren, bleiben im reinen Posix nur 3 Systemansätze: tar, cpio und pax, die im Orginal hart verlinkte Einträge auch in der Kopie wieder herstellen. Die können aber aufgrund ihres Verwendungszwecks (die sollen ja Inhalte kopieren) hier nicht genommen werden - außer, man beißt in den sauren Apfel wie von mir ganz oben vorgeschlagen und kopiert erst alles und löscht es dann wieder.


    find kann mit dem Qualifizierer "-links" durchaus Dateien finden, die hart verlinkt sind - "-links" kennt Posix aber nicht. Das kennt dafür "stat (1)", das auch rausfinden kann, ob eine Datei mehr als einmal verlinkt ist.


    Mit mehreren "find"-Läufen kann man also folgendes tun:

    1. Lauf: Mit "find -type d" und "mkdir" die Verzeichnisstruktur rüberziehen

    2. Lauf: Mit "find -type r" und "touch" alle files leer anlegen (wobei man aber sicherstelen muß, dass man dann auch die Rechte und Besitzer neu richtig anlegt)

    3. Lauf: Mit "find -type r" und "-exec stat {}" alle Hard links im Originalbaum finden (dann files mit diesem inode suchen und in die Liste eintragen), dann mit dieser Liste die passenden Files im Zielbaum finden und neu hart verlinken


    Woran man man wieder lernt, dass für Nicht-Systemdateien Hardlinks wirklich eine doofe Idee sind. Oder man dokumentiert sehr genau, welche Hard Links man anlegt, dann spart man sich das ganze Gerödel von oben und geht nur den dokumentierten Hard Links nach.

    2 Mal editiert, zuletzt von tofro ()