cp -r -l in MacOS (copia ricorsiva preservando i collegamenti reali)


12

Sto cercando di copiare un albero di directory ricorsivamente preservando i collegamenti fisici al file. Usando gnu cp, questo funzionerebbe con il flag -l. cp ricrea quindi la struttura della directory, ma non dovrebbe copiare il contenuto di ogni file.

Questo è preliminare a un backup, prima voglio fare una copia economica (hardlinked) del backup precedente e quindi risincronizzare la directory di origine su questa copia. Circa:

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

Sfortunatamente, il cp di OSX non supporta il flag -l, per quanto ne so, cpio non supporta la copia ricorsiva. L'altra alternativa è pax, ma ciò porta alla copia dell'intera struttura di directory:

 pax -rw backups/yesterdays_backup backups/todays_backup

trasforma:

 yesterdays_backup
 |
  \source_dir (...)

per:

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

Dovrebbe esserci un modo semplice / ovvio per farlo, ma al momento sono sconcertato ... Qualche alternativa a cpio e pax? Vorrei evitare di dover installare gnu cp.

Sono a conoscenza di Timemachine, ma questo non eseguirà correttamente il backup incrementale delle directory crittografate.

mac  backup  rsync  cp 

usando find insieme a cpio aggirare la mancanza di cpio ricorsivo come descritto qui: ( mikerubel.org/computers/rsync_snapshots/#Incremental ) ma non sembra molto elegante ...

Risposte:


16

È abbastanza facile installare cp da MacPorts, tuttavia, se non si desidera o si desidera creare uno script portatile, sono disponibili tre opzioni:

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

pace

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup

Cosa succede se l'origine e la destinazione si trovano su dischi diversi? Rsync conserverebbe comunque i collegamenti reali dall'origine nella copia effettuata nella destinazione?
lpacheco,

7

È facile installare il coreutilspacchetto da MacPorts che contiene il cpcomando GNU rinominato gcp.

Ma ancora meglio, le versioni più recenti di rsync, inclusa almeno quella in OS X 10.5, supportano l'opzione --link-dest che dovrebbe eliminare la necessità del cp -al iniziale. Vedi qui . È buona norma utilizzare anche l'opzione -E per copiare attributi estesi, ACL, ecc.


1

Sebbene cpionon supporti direttamente la copia ricorsiva, è possibile alimentare l'elenco esatto dei file che si desidera copiare nel suo input standard e ottenere l'effetto di una copia ricorsiva utilizzando il findpiping in cpio. Questo è direttamente analogo all'utilizzo di GNU tarcon le opzioni -T -(il che significa leggere l'elenco dei file per eseguire il backup dall'input standard).


1

Credo che anche quello che vuoi possa essere raggiunto ditto yesterdays_backup todays_backup. Per impostazione predefinita, dittoesegue una copia ricorsiva che conserva collegamenti, ACL e attributi estesi.


il problema è che la copia non è più economica quando l'obiettivo è quello di creare collegamenti reali attraverso l'ambito della directory. idem può preservarli quando esistono, ma non si può dire di collegare invece di creare un duplicato.
Florenz Kley,

Non credo che si possa nemmeno dire che idem conservi i collegamenti reali della directory. la pagina man dice che fa solo file hard link
Chris F Carroll,

0

+1 per la risposta di Paul. idem sarebbe un'opzione, ma solo se usato insieme a find - mantiene i collegamenti reali, ma solo all'interno delle directory.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.