cp -r -l dans MacOS (copie récursive préservant les liens durs)

12

J'essaie de copier une arborescence de répertoires en préservant récursivement les liens physiques vers le fichier. En utilisant gnu cp, cela fonctionnerait avec le drapeau -l. cp recréerait alors la structure du répertoire, mais n'aurait pas besoin de copier le contenu de chaque fichier.

Ceci est préliminaire à une sauvegarde, je veux d'abord faire une copie bon marché (liée en dur) de la sauvegarde précédente, puis rsync le répertoire source sur cette copie. Grossièrement:

 cp -r -l yesterdays_backup todays_backup
 rsync -a source_dir todays_backup

Malheureusement, le cp d'OSX ne prend pas en charge l'indicateur -l, pour autant que je sache, cpio ne prend pas en charge la copie récursive. L'autre alternative est pax, mais cela entraîne la copie de la structure complète du répertoire:

 pax -rw backups/yesterdays_backup backups/todays_backup

se transforme:

 yesterdays_backup
 |
  \source_dir (...)

à:

 todays_backup
 |
  \backups
          \yesterdays_backup
                            \source_dir(...)

Il devrait y avoir un moyen facile / évident de le faire, mais je suis actuellement perplexe ... Des alternatives à cpio et pax? Je voudrais éviter d'avoir à installer gnu cp.

Je connais Timemachine, mais cela ne sauvegardera pas correctement les répertoires chiffrés de manière incrémentielle.


la source
utiliser find avec cpio contourne le manque de cpio récursif comme décrit ici: ( mikerubel.org/computers/rsync_snapshots/#Incremental ) mais ne semble pas très élégant ...

Réponses:

16

Il est assez facile d'installer cp à partir de MacPorts, cependant, si vous ne voulez pas ou ne voulez pas créer un script portable, vous avez trois options:

rsync

rsync --archive --link-dest=../yesterdays_backup backups/yesterdays_backup\
   backups/todays_backup

cpio

mkdir backups/todays_backup
cd backups/yesterdays_backup
find . -print | cpio -p -al ../todays_backup

pax

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup
Paul Wagland
la source
Que faire si la source et la destination se trouvent sur des disques différents? Rsync conserverait-il toujours les liens durs de la source dans la copie faite dans la destination?
lpacheco
7

Il est facile d'installer le coreutilspackage à partir de MacPorts qui contient la cpcommande GNU renommée gcp.

Mais encore mieux, les versions plus récentes de rsync, y compris celle d'OS X 10.5 au moins, prennent en charge l'option --link-dest, ce qui devrait éliminer le besoin de cp -al initial. Voyez ici . Il est recommandé d'utiliser également l'option -E pour copier les attributs étendus, les listes de contrôle d'accès, etc.


la source
1

Bien cpioqu'il ne prenne pas directement en charge la copie récursive, vous pouvez alimenter la liste exacte des fichiers que vous souhaitez copier dans son entrée standard et obtenir l'effet d'une copie récursive à l'aide de findpiped into cpio. Ceci est directement analogue à l'utilisation de GNU taravec les options -T -(ce qui signifie lire la liste des fichiers à sauvegarder depuis l'entrée standard).

Jonathan Leffler
la source
1

Je crois que ce que vous voulez peut également être réalisé ditto yesterdays_backup todays_backup. Par défaut, dittoeffectue une copie récursive qui préserve les liens durs, les listes de contrôle d'accès et les attributs étendus.


la source
le problème est que la copie n'est plus bon marché lorsque l'objectif est de créer des liens durs à travers la portée du répertoire. idem peut les conserver lorsqu'ils existent, mais on ne peut pas lui dire de lier au lieu de créer un doublon.
Florenz Kley
Je ne pense pas qu'on puisse même dire à idem de conserver les liens durs des répertoires. page de manuel dit qu'il ne fait que déposer des liens durs
Chris F Carroll
0

+1 pour la réponse de Pauls. idem serait une option, mais seulement s'il est utilisé en conjonction avec find - il conserve les liens durs, mais uniquement à l'intérieur des répertoires.

Florenz Kley
la source