Det här är ett mycket intressant problem; hur man bäst kopierar en hel katalogstruktur och samtidigt bevarar den så intakt som bara är möjligt. Vi har nu 5 förslag i tråden. För att lättare kunna jämföra har jag tagit mig friheten att ändra så att alla 5 varianterna nu kopierar från och till samma ställen som i det första inlägget...
Kod: Markera allt
cd /old/home/.
find . -depth -print0 | sudo cpio --null --sparse -pvd /new/.
Kod: Markera allt
cd /old/home/.; tar cf - . | (cd /new/.; tar xf -)
Kod: Markera allt
sudo rsync -axS --exclude='/*/.gvfs' /old/home/. /new/.
Jag har testat dessa förslag noga under
Lucid beta2 och har kommit fram till följande resultat:
cpio tar cp -r rsync -a sudo rsync -aS
protected files - - - - ok
dense files - ok ok ok -
sparse files ok - ok - ok
directories ok ok ok ok ok
block devices ok - - - ok
character devices ok - - - ok
named pipes ok ok ok ok ok
sockets ok - ok ok ok
symbolic links ok ok ok ok ok
hard links ok ok - - -
file owner - - - - ok
member group - - - ok ok
other group - - - - ok
permission bits - - - ok ok
access timestamp - - - - -
modify timestamp - ok - ok ok
change timestamp - - - - -
security context - - - - -
trusted attributes - - - - -
user attributes - - - - -
access control lists - - - - -
Det som bevaras markeras med "
ok" och det som inte bevaras markeras med "
-" i tabellen.
protected files är lässkyddade filer, samt filer i läs- och/eller listskyddade kataloger.
dense files är vanliga filer som inte är
sparse.
directories är vanliga kataloger.
file owner är filens ägare.
member group och
other group är filens grupp som man är respektive inte är medlem i.
permission bits är
läs/skriv/kör-rättigheter samt
setuid/setgid/
sticky bit.
access timestamp är tidpunkten när någon senast läste från eller skrev till filen.
modify timestamp är tidpunkten när filen senast ändrades.
change timestamp är tidpunkten när filens metadata senast ändrades.
trusted attributes är som
user attributes, men kräver
root-rättigheter.
Vi ser direkt att inget att förslagen är helt perfekt och att det är ganska stor skillnad mellan de båda olika
rsync-varianterna, vilket till stor del beror på
sudo.
Vad som inte syns är att
cpio-förslaget lider av ett mer allvarligt problem som gör så att en massa kataloger i kopian får
root som ägare, vilket leder till till att man förmodligen inte ens kan logga in efteråt eftersom bland annat
~/.ICEauthority drabbas. Källan till problemet är att
find körs med
--depth som gör så att katalogerna listas efter alla filer de innehåller istället för innan. Det leder till att
cpio måste kopiera filerna till kataloger som inte finns ännu, vilket tydlen löses med
-d som ser till att skapa kataloger där det saknas. Men just eftersom vi kör
cpio med
sudo så kommer alla kataloger som skapas på det sättet att ägas av
root. Det hela går att komma runt genom att helt enkelt plocka bort
--depth och
-d, och då bevarar
cpio file owner,
member/other group och
permission bits; även för katalogerna. Om någon förstår syftet med att använda
--depth och
-d så är jag tacksam för en förklaring.
Nu är det dags att fundera över vad som kan förbättras. Det är möjligt att
cpio- och
tar-förslagen kan bli bra mycket bättre med rätt flaggor, men det känns inte helt motiverat att undersöka den saken närmare eftersom de förslagen är onödigt komplicerade redan som det är. Jag väljer istället att koncentrera mig på
cp och
rsync, och hur man påverkar vad som bevaras med dessa kommandon.
Eftersom vi redan sett att det påverkar ganska mycket om man kör med eller utan
sudo så inför jag "
sudo" som anger att något endast bevaras om man kör med
sudo, men inte annars. Här är resultaten av mina utförliga tester:
cp --sparse=... never always auto
protected files sudo sudo sudo
dense files ok - ok
sparse files - ok ok
directories - - -
block devices - - -
character devices - - -
named pipes - - -
sockets - - -
symbolic links - - -
hard links - - -
file owner - - -
member group - - -
other group - - -
permission bits - - -
access timestamp - - -
modify timestamp - - -
change timestamp - - -
security context - - -
trusted attributes - - -
user attributes - - -
access control lists - - -
cp --preserve=... links ownership mode timestamps context xattr all
protected files sudo sudo sudo sudo sudo sudo sudo
dense files ok ok ok ok ok ok ok
sparse files ok ok ok ok ok ok ok
directories - - - - - - -
block devices - - - - - - -
character devices - - - - - - -
named pipes - - - - - - -
sockets - - - - - - -
symbolic links - - - - - - -
hard links ok - - - - - ok
file owner - sudo - - - - sudo
member group - ok - - - - ok
other group - sudo - - - - sudo
permission bits - - ok - - - ok
access timestamp - - - ok - - ok
modify timestamp - - - ok - - ok
change timestamp - - - - - - -
security context - - - - sudo sudo sudo
trusted attributes - - - - - sudo sudo
user attributes - - - - - ok ok
access control lists - - ok - - ok ok
cp -r -P -d -p -a
protected files sudo sudo sudo sudo sudo
dense files ok ok ok ok ok
sparse files ok ok ok ok ok
directories ok - - - ok
block devices sudo - - - sudo
character devices sudo - - - sudo
named pipes ok - - - ok
sockets ok - - - ok
symbolic links ok ok ok - ok
hard links - - ok - ok
file owner - - - sudo sudo
member group - - - ok ok
other group - - - sudo sudo
permission bits - - - ok ok
access timestamp - - - ok ok
modify timestamp - - - ok ok
change timestamp - - - - -
security context - - - - sudo
trusted attributes - - - - sudo
user attributes - - - - ok
access control lists - - - ok ok
rsync -S -r --devices --specials -D -l -H
protected files sudo sudo sudo sudo sudo sudo sudo
dense files - ok ok ok ok ok ok
sparse files ok - - - - - -
directories - ok - - - - -
block devices - - sudo - sudo - -
character devices - - sudo - sudo - -
named pipes - - - ok ok - -
sockets - - - ok ok - -
symbolic links - - - - - ok -
hard links - - - - - - ok
file owner - - - - - - -
member group - - - - - - -
other group - - - - - - -
permission bits - - - - - - -
access timestamp - - - - - - -
modify timestamp - - - - - - -
change timestamp - - - - - - -
security context - - - - - - -
trusted attributes - - - - - - -
user attributes - - - - - - -
access control lists - - - - - - -
rsync -o -g -p -t -X -A -a -aSHAX
protected files sudo sudo sudo sudo sudo sudo sudo sudo
dense files ok ok ok ok ok ok ok -
sparse files - - - - - - - ok
directories - - - - - - ok ok
block devices - - - - - - sudo sudo
character devices - - - - - - sudo sudo
named pipes - - - - - - ok ok
sockets - - - - - - ok ok
symbolic links - - - - - - ok ok
hard links - - - - - - - ok
file owner sudo - - - - - sudo sudo
member group - ok - - - - ok ok
other group - sudo - - - - sudo sudo
permission bits - - ok - - ok ok ok
access timestamp - - - - - - - -
modify timestamp - - - ok - - ok ok
change timestamp - - - - - - - -
security context - - - - sudo - - sudo
trusted attributes - - - - sudo - - sudo
user attributes - - - - ok - - ok
access control lists - - - - - ok - ok
De bästa varianterna är
sudo cp -a och
sudo rsync -aSHAX, så det får bli dem vi ställer mot varandra.
Att
rsync, till skillnad från
cp, där det går gör om
dense files till
sparse behöver egentligen inte ses som en nackdel. Det kan ju i många fall tvärtom vara en fördel om kopian blir mindre än originalet. Men eftersom det går att ordna motsvarande med
cp -a --sparse=always, medan
rsync däremot inte kan bevara både
dense och
sparse files samtidigt så går den första poängen till
cp.
Nästa skillnad är att
cp -a bevarar
access timestamp, vilket
rsync -aSHAX inte klarar av; så andra poängen går också den till
cp. Å andra sidan så är det sällan man är intresserad av
atime om man inte använder
mutt eller liknande program.
När det gäller syntax så är
cp -a lättare att komma ihåg än
rsync -aSHAX, så även den tredje poängen går till
cp.
Att kopiera via nätverket är
rsync mycket bra på. Det går så klart att montera en nätverksutdelning och låta
cp kopiera till monteringen, men vad som fungerar och inte fungerar i det fallet ligger helt utanför vad
cp kontrollerar, så denna poäng vinner
rsync.
Att kunna återuppta en avbruten kopiering och bara kopiera sådant som inte redan är kopierat är
rsync som gjort för. Det finns ett liknande beteende till
cp med
-u, men det är långt ifrån lika bra, så
rsync tar ohotat hem ytterligare en poäng.
Om man av någon anledning vill utesluta saker från kopieringen så fungerar det bra med
rsync --exclude=, men det går inte alls med
cp, så
rsync får därför sin tredje poäng. Det går iofs att komplettera
cp med andra verktyg som t.ex.
find för att få till samma sak, men det kan lätt bli onödigt knöligt.
Både
rsync och
cp håller sig inom ett och samma filsystem med
-x, och båda visar vad som pågår med
-v, så här finns det inga väsentliga skillnader alls.
Sammanfattningsvis så har vi nu dessa två förslag:
Vilket som är bäst får man nog avgöra själv. Tittar man bara på vad som bevaras så vinner
cp, men
rsync har som bekant flera andra fördelar.