Re: mtree auf drei Verzeichnisebenen begrenzen

From: Marc Santhoff <M.Santhoff(at)web.de>
Date: Thu, 19 May 2011 22:49:29 +0200

Am Mittwoch, den 11.05.2011, 17:52 +0200 schrieb Oliver Fromme:
> Marc Santhoff wrote:
> > Am Mittwoch, den 11.05.2011, 11:16 +0200 schrieb Oliver Fromme:
> > > Mir ist nicht vollkommen klar, warum Du das tun möchtest,
> > > vorausgesetzt, ich habe Dich überhaupt richtig vestanden.
> >
> > Simple Sache schwer zu erklären:
> >
> > Es gibt bereits mehrere Backup-Platten (extern, USB) die mit Daten
> > befüllt sind. Manchmal muß eine gewechselt werden oder es kommt eine
> > Platte dazu. Auch bei einem Wechsel werden die Altdaten nciht kopiert.
> >
> > Bevor ich die Backup- und Kopierskripte benutzen kann, müssen alle Pfade
> > vorhanden sein, was mittlerweile eine Menge sind.
>
> Ok ... Mein Backup-Skript legt die Pfade (/backup/$host/$datum)
> immer selbst an.

Keine Diskussion nötig, sollte unbedingt so sein und mache ich sonst so.
Hier ist aber leider einer der Fälle eingetreten, wo ein Provisorium
sich als Normallösung etabliert hat.

Wenn ich genügend Zeit dafür habe, stelle ich das ganze um und benutze
die Pfadliste und mtree als Präambel für die Skripte oder so.

> > > Aber Deiner Beschreibung nach sollte das folgende Kommando
> > > das Gewünschte tun:
> > >
> > > # cd $WURZEL
> > > # echo '*/*/*/*' | mtree -cin -X /dev/stdin > mydist.mtree
> > >
> > > Damit bekommst Du die Verzeichnisse bis in die dritte Ebene
> > > (die vierte Ebene wird vom vierten Stern ausgeschlossen).
> >
> > Ah ja, das sieht sehr gut aus. Testen kann ich erst späeter ...
> > Auf echo wäre ich z.B. als letzte gekommen.
>
> Das echo ist nur ein »work-around« dafür, dass man Excludes
> bei mtree nicht direkt angeben kann, sondern dass bei der
> Option -X einen Dateiname erwartet wird, wo die Excludes
> drin sind. Man könnte auch eine temporäre Datei verwenden,
> die nur die Zeile »*/*/*/*« enthält.

Hat gut funktioniert und ist kompakt und auch relativ gut zu merken -
bleibt meine Lösung. :)

> Manche Shells bieten auch eine Möglichkeit, auf der Kommando-
> zeile Strings direkt als Datei zu verfüttern. Bei der zsh
> geht das z.B., indem man einen sogenannten here-string "<<<"
> mit process-substitution "=()" verknüpft:
>
> # cd $WURZEL
> # mtree -cin -X =(<<<*/*/*/*) > mydist.mtree

Dann muß man aber immer eine zsh voraussetzen können. Auch mit der
Erinnerung an solche Zeichenketten habe ich echt Schwierigkeiten,
jedenfalls wenn längere Zeit daziwschen liegt.

> Übrigens: Wenn man einfach nur ein »Skelett« von Verzeich-
> nissen kopieren möchte, geht das auch ganz ohne mtree. Das
> Tool find(1) hat eine Option für die Verzeichnistiefe. Die
> Ausgabe davon kann man dann an mkdir (via xargs) füttern:
>
> # cd $WURZEL_ALT
> # find . -type d -depth -4 > mydirs.txt
> # cd $WURZEL_NEU
> # xargs mkdir < mydirs.txt
>
> -depth -4 bedeutet »Tiefe kleiner als vier«. Nachteil:
> mtime und permissions werden nicht kopiert. Aber ich denke,
> dass das in Deinem Fall nicht schlimm ist.

Auch schön zu merken, aber ohne Benutzerrechte nicht geignet.

> Wenn man mtime und permissions mitkopieren möchte, könnte
> man cpio bemühen:
>
> # cd $WURZEL_ALT
> # find . -type d -depth -4 | cpdio -dump $WURZEL_NEU
>
> Nachteil hierbei: Das geht nur in einem Rutsch. Man kann
> nicht den Verzeichnisbaum erst in einer Textdatei speichern
> (wie bei mtree), um ihn später zu erzeugen.

Auch schön knapp und merkbar. Wenn ich eine Platte neu einrichte steht
auch immer eine ältere in Reichweite. Trüge aber zum Beibehalten der
unsauberen Lösung bei ...

Vielen Dank Olli!

-- 
Marc Santhoff <M.Santhoff(at)web.de>
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Thu 19 May 2011 - 22:48:45 CEST

search this site