Come copiare le directory preservando gli hardlink?


40

Come spostare le directory che hanno file in comune da una partizione all'altra?

Supponiamo di avere una partizione montata /mnt/Xcon directory che condividono file con hardlink. Come spostare tali directory in un'altra partizione, lascia che sia /mnt/Ycon la conservazione di quei collegamenti.

Per una migliore illustrazione di cosa intendo per "directory che condividono file in comune con i collegamenti", ecco un esempio:

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a

Per essere più specifici, supponiamo che la dimensione totale dei file sia 10G e che ogni file abbia 10 collegamenti. La domanda è come spostarlo a destinazione usando 10G (qualcuno potrebbe dire di copiarlo con 100G e quindi eseguire la deduplicazione - non è quello che sto chiedendo)

Risposte:


29

Prima risposta: The GNU Way

Le cp -acopie GNU ricorsivamente preservando la maggior quantità possibile di struttura e metadati. In questo sono inclusi i collegamenti reali tra i file nella directory di origine. Per selezionare la conservazione del collegamento reale in modo specifico senza tutte le altre funzionalità di -a, utilizzare --preserve=links.

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst

3
+1 su tar, -1 per l'utilizzo di argomenti specifici di gnu per cp.
WhyNotHugo,

Hai dato tre risposte in una. Potresti dividerli in tre in modo che possano essere commentati e valutati separatamente? (Suggerimento: puoi modificarlo per lasciarne solo uno, ad esempio "cp -a". Successivamente aggiungine altri due, per "tar" e "pax")
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki divisa compiuta
Alan Curry

6
@Hugo: non c'è niente di sbagliato nell'usare argomenti specifici di GNU per strumenti standard. Le versioni GNU sono lo standard di fatto in questi giorni, e anche quando non erano preinstallate, era pratica comune installare strumenti GNU (so che l'ho sempre fatto - erano semplicemente migliori di, ad esempio, versioni di Solaris e * bsd e hanno fornito coerenza tra diversi * nix). Probabilmente è buona prassi sottolineare i GNUismi quando li usi ma non sono richiesti. Inoltre Grzegorz non ha detto "non su Linux", quindi è ragionevole supporre che sia l'ambiente di cui sta parlando.
Cas

1
@WhyNotHugo: In che modo POSIX "può essere più standard?". POSIX è il materiale che ci ha portato dove siamo. Sapevi che tutte le versioni di Windows da Windows NT sono completamente conformi a POSIX? Hanno una limitazione della lunghezza del percorso di 255 caratteri quando si usano le funzioni I / O del file POSIX, il che li rende inutili. Sapevi che Solaris, Irix, HP-UX sono tutti conformi a POSIX, eppure tutti gli argomenti sui loro strumenti differiscono (ad es. Tar). cp -a è un requisito minimo per qualsiasi versione di cp che vuole sostituire la copia GNU.
Johannes Overmann,

37

rsync ha un'opzione -Ho --hard-linksper questo e ha i consueti vantaggi di rsync di poter essere arrestato e riavviato e di essere rieseguito per gestire in modo efficiente tutti i file che sono stati modificati durante / dopo l'esecuzione precedente.

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]

Leggi la rsyncpagina man e cerca -H. Ci sono molti più dettagli su particolari avvertimenti.


2
Ho controllato - funziona.
Grzegorz Wierzowiecki,

si lo so. Lo uso da anni nei miei script di backup. anche per spostare file tra filesystem come nella tua domanda.
Cas

rsync usa gobs di memoria quando costruisce il suo elenco di file. Per me dopo molte ore di "Elenco file di costruzione ..." ha riempito i miei 16 GB di memoria e salvato senza copiare nulla. YMMV.
msc

2
Da man rsync: a partire da rsync 3.0.0, l'algoritmo ricorsivo utilizzato è ora una scansione incrementale che utilizza molta meno memoria rispetto a prima e inizia il trasferimento dopo che è stata completata la scansione delle prime directory. Questa scansione incrementale influisce solo sul nostro algoritmo di ricorsione e non modifica un trasferimento non ricorsivo. È anche possibile solo quando entrambe le estremità del trasferimento sono almeno la versione 3.0.0. Si noti che entrambi --delete-beforee --delete-afterdisabilitare questo algoritmo migliorato.
Cas

Inoltre, sebbene rsyncsia anche incredibilmente utile, non è sempre lo strumento migliore per ogni lavoro. In questi giorni, preferisco utilizzare i set di dati ZFS in modo da poter eseguire un'istantanea e zfs sendloro - Uso principalmente rsync su filesystem non ZFS. btrfsha un'istantanea simile + capacità di invio.
CAS

14

Terza risposta: il modo POSIX

POSIX non ha standardizzato l' tarutilità, sebbene abbia standardizzato il tarformato dell'archivio. Viene chiamata l'utilità POSIX per la manipolazione degli archivi tar paxe ha la funzione bonus di poter eseguire il pacchetto e decomprimere l'operazione in un singolo processo.

mkdir dst
pax -rw src dst

10

Seconda risposta: The Ancient UNIX Way

Creare un archivio tar nella directory di origine, inviarlo su una pipe e decomprimerlo nella directory di destinazione.

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)

1
controllato -> funziona. Hardlink conservati.
Grzegorz Wierzowiecki,

1
Qualche idea sul perché questo in realtà preserva gli hardlink?
peterph

1
Perché tarpreserva i collegamenti. In GNU tar, almeno, puoi disabilitare questo comportamento con--hard-dereference
cas

Nel mio caso, tentando di copiare una gerarchia di directory di grandi dimensioni (un backup di TimeMachine), tar ha conservato alcuni collegamenti fisici ma in alcuni casi ha replicato il file. Penso che questo sia perché il tar xnon ha l'elenco completo dei file in quanto i file vengono ancora inviati da tar c. Probabilmente se hai salvato l'intero archivio prima di estrarlo, andrebbe bene. Sarei molto felice se qualcuno potesse confermare questa teoria.
msc,

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.