Řešení 1:
Použil bych rsync, protože to znamená, že pokud je z jakéhokoli důvodu přerušen, můžete jej snadno restartovat s velmi malými náklady. A protože je rsync, může se dokonce restartovat částečně přes velký soubor. Jak jiní zmiňují, může snadno vyloučit soubory. Nejjednodušší způsob, jak zachovat většinu věcí, je použít -a
flag – ‘archiv.’ Takže:
rsync -a source dest
Ačkoli UID/GID a symbolické odkazy jsou zachovány pomocí -a
(viz -lpgo
), z vaší otázky vyplývá, že možná budete chtít úplné kopie informací o souborovém systému; a -a
nezahrnuje pevné odkazy, rozšířené atributy nebo seznamy ACL (v systému Linux) nebo výše uvedené ani zdrojové větve (na OS X.) Pro robustní kopii souborového systému tedy budete muset zahrnout tyto příznaky:
rsync -aHAX source dest # Linux
rsync -aHE source dest # OS X
Výchozí cp se spustí znovu, i když -u
příznak bude "kopírovat pouze tehdy, když je SOURCE soubor novější než cílový soubor nebo když cílový soubor chybí" . A -a
(archivovat) příznak bude rekurzivní, nebude znovu kopírovat soubory, pokud budete muset restartovat a zachovat oprávnění. Takže:
cp -au source dest
Řešení 2:
Při kopírování do místního systému souborů mám tendenci používat rsync s následujícími možnostmi:
# rsync -avhW --no-compress --progress /src/ /dst/
Tady je moje úvaha:
-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)
Viděl jsem o 17 % rychlejší přenosy pomocí výše uvedených nastavení rsync přes následující příkaz tar, jak navrhuje jiná odpověď:
# (cd /src; tar cf - .) | (cd /dst; tar xpf -)
Řešení 3:
Když musím kopírovat velké množství dat, obvykle používám kombinaci tar a rsync. Prvním krokem je tar to, něco jako toto:
# (cd /src; tar cf - .) | (cd /dst; tar xpf -)
Obvykle s velkým množstvím souborů budou některé, které tar z jakéhokoli důvodu nezvládne. Nebo se možná proces přeruší, nebo pokud se jedná o migraci souborového systému, možná budete chtít provést počáteční kopii před skutečným krokem migrace. V každém případě po úvodní kopii udělám krok rsync, abych to všechno synchronizoval:
# cd /dst; rsync -avPHSx --delete /src/ .
Všimněte si, že koncové lomítko na /src/
je důležité.
Řešení 4:
rsync
Zde je rsync, který používám, preferuji cp pro jednoduché příkazy, ne toto.
$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/
cpio
Zde je způsob, který je ještě bezpečnější, cpio. Je to asi tak rychlé jako dehet, možná trochu rychlejší.
$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null
tar
To je také dobré a pokračuje to i při selhání čtení.
$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -
Všimněte si, že všechny jsou pouze pro místní kopie.
Řešení 5:
Toto vlákno bylo velmi užitečné a protože bylo tolik možností, jak dosáhnout výsledku, rozhodl jsem se několik z nich porovnat. Věřím, že mé výsledky mohou být užitečné pro ostatní, kteří mají smysl pro to, co fungovalo rychleji.
Chcete-li přesunout 532 Gb dat distribuovaných mezi 1 753 200 soubory měli jsme ty časy:
rsync
trvalo 232 minuttar
trvalo 206 minutcpio
trvalo 225 minutrsync + parallel
trvalo 209 minut
V mém případě jsem raději použil rsync + parallel
. Doufám, že tyto informace pomohou více lidem rozhodnout se mezi těmito alternativami.
Kompletní benchmark je zveřejněn zde