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.