Kopieren der Verzeichnisstruktur ohne Kopieren von Dateien unter Mac OS X

7

Ich möchte die Verzeichnisstruktur in einem Verzeichnis in ein anderes kopieren, ohne die eigentlichen Dateien zu kopieren. Anstelle der Dateien möchte ich entweder eine leere Datei mit demselben Namen oder einen Symlink zum ursprünglichen Speicherort.

Wie könnte ich das unter OS X machen? Kommandozeilen-Tools (rsync / find / tar / whatever), Shell-Skripte usw. sind akzeptabel, Software, die ich kaufen muss, wahrscheinlich nicht.

ShreevatsaR
quelle

Antworten:

10
user@osx:~/from$ find . -type d -exec mkdir -p ~/to/{} \;
user@osx:~/from$ find . -type f -exec ln -s ~/from/{} ~/to/{} \;

oder

user@osx:~/from$ find . -type f -exec touch ~/to/{} \;
whitequark
quelle
Sowohl dies als auch das lndir Lösung hat funktioniert. Ich habe dies "akzeptiert", weil lndir mit X kommt und möglicherweise nicht mehr vorhanden ist oder auf einem System nicht vorhanden ist. Wenn Sie lndir haben, ist es am einfachsten, es zu benutzen.
ShreevatsaR
5 Jahre danach klappt das noch. Ich bin seit über 15 Jahren kein ernsthafter Unix-Kommandozeilenbenutzer mehr.
Mark Levison
7

Versuchen lndir. Von seiner Manpage:

The lndir program makes  a  shadow  copy  todir  of  a  directory  tree
fromdir,  except  that  the shadow is not populated with real files but
instead with symbolic links pointing at the real files in  the  fromdir
directory tree.
Doug Harris
quelle
Das ist OS X-Magie!
whitequark
Wow, das wäre genau das, was ich will. Es befindet sich aus irgendeinem Grund in / usr / X11 (die Manpage ist auch unter X aufgeführt). Aus irgendeinem Grund, wenn ich es laufen lasse, wie lndir dir1 dir2, Ich bekomme dir1: No such file or directory.
ShreevatsaR
Oh, das wurde behoben. Die Manpage sagt The fromdir argument […] is relative to todir (not the current directory). Wenn Sie also sowohl dir1 als auch dir2 im aktuellen Verzeichnis haben, müssen Sie Folgendes eingeben lndir ../dir1 dir2. Natürlich kann auch der vollständige Pfad für dir1 eingegeben werden. Danke noch einmal.
ShreevatsaR
4

Eine andere Lösung, die für mich funktioniert, ist die Verwendung rsync und alle Dateien ausschließen, z.

$ rsync -a /path/from/ /path/to/ --include \*/ --exclude \*

Das --include \*/ gibt an, dass alle Verzeichnisse kopiert werden sollen, und --exclude \* Gibt an, dass alle Dateien von der Kopie ausgeschlossen werden sollen.

Das Schöne daran ist, dass die neue Verzeichnishierarchie dieselben Attribute, Zeitstempel, Berechtigungen usw. aufweist wie das Original.

Paul R
quelle
1
Ich stimme zu, die richtigen Attribute zu haben ist großartig. Wissen Sie, ob Sie etwas gegen die Dateien tun können, damit sie existieren (entweder als leere Dateien oder als Symlinks)?
ShreevatsaR
Entschuldigung - ich habe diesen Teil der Frage das erste Mal verpasst - mit rsync ist das vielleicht möglich, aber ich muss noch etwas darüber nachdenken.
Paul R
1

Hier ist eine weitere Variante der rsync Methode, die Ordnersymbole und Finder-Beschriftungen beibehält:

rsync -Ea /path/from/ /path/to/ --include="*/"  --include="Icon*" --exclude="*"

Hiermit werden keine Datei-Aliase kopiert. Sie können diese also mit der obigen Antwort von whitequark kombinieren.

AAGD
quelle
0

Dadurch werden die Verzeichnisse in temp gefunden und das führende / home / bryan / von ihnen entfernt und erstellen Sie die neuen Verzeichnisse

  for i in `find /home/bryan/temp -type d| sed 's/\/home\/bryan\///g'`
  do mkdir $i
  done

Ich schlage vor, den Code zeilenweise einzugeben (auf diese Weise werden Semikolons (nicht gezeigt) korrekt platziert)

bryan
quelle