Řešení 1:
Použijte --compare-dest.
Z manuálové stránky:
--compare-dest=DIR -Tato volba dává pokyn rsync, aby použil DIR na cílovém počítači jako další hierarchii pro porovnání cílových souborů s prováděním přenosů (pokud soubory v cílovém adresáři chybí). Pokud je v adresáři DIR nalezen soubor shodný se souborem odesílatele, NEBUDE tento soubor přenesen do cílového adresáře. To je užitečné pro vytváření řídké zálohy pouze souborů, které se změnily od dřívější zálohy.
nejprve zkontrolujte syntaxi pomocí --dry-run
rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/
Až budete s výstupem spokojeni:
rsync -aHxv --progress --compare-dest=folder2/ folder1/ folder3/
tento odkaz má dobré vysvětlení rozsahu --compare-dest.
Řešení 2:
Tento malý skript by měl fungovat:
folder1="firsts_folder/"
folder2="second_folder/"
folder3="target_folder"
for x in `rsync -rcnC --out-format="%n" $folder1 $folder2`
do
if [ -d "$folder1/$x" ]; then
mkdir -p "$folder3/$x"
else
cp -frv $folder1/$x $folder3/$x
fi
done
Ale také si myslím, že analýza výstupu diff -qr by byla lepším řešením, protože vám konzistentně poskytuje cestu a název pro každý soubor.
UPRAVIT
Toto by byl jeden příkaz, váš příkaz mírně upravený. Ale vytvoří folder1
pod folder3
. A nefunguje s úplnými cestami, ale ani skript výše nefunguje s úplnými cestami.
rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/
Použil jsem \"
v rsync
aby fungoval se soubory a adresáři obsahujícími mezery. Testováno na Ubuntu 10.04. Doufám, že to pomůže.
Řešení 3:
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/
To je nejjednodušší forma, kterou jsem mohl vymyslet, pokud jste ochotni nejprve sestoupit do folder1
před vydáním příkazu.
Toto je pomalejší možnost, ale věřím, že splňuje vaše požadavky a mohla by být provedena pomocí nerelativních názvů adresářů:
rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/
Nechal jsem váš původní rsync
pouze příkaz, protože jste řekli, že vám dává správný seznam souborů (a moje testovací soubory se zjevně liší od vašich, takže jsem nemohl s jistotou říci, že bych dostal správný seznam souborů, kdybych si s tím pohrál).
grep
slouží k odstranění jmen adresářů z výstupu rsync
.
Výstup grep
je pak přesměrován do jiného rsync
pomocí xargs
. V parametru folder1/./{}
extra ./
se používá k tomu, aby řekl rsync, aby vytvořil relativní adresáře začínající ./{}
, ignorovat folder1/
. Jinými slovy, vyhýbá se vytváření folder3/folder1/
.
Byl jsem schopen to otestovat pouze na CentOS 6.4, ale AFAIK by to mělo fungovat stejně v Ubuntu 12.04.
UPRAVIT: Měl bych poznamenat, že kovář Odpověď 's je nepochybně lepší, ale chtěl jsem to udělat s vaším původním rsync
příkaz v taktu, protože vám dával požadovaný výstup.