GNU/Linux >> Znalost Linux >  >> Linux

porovnejte 2 adresáře a zkopírujte rozdíly ve 3. adresáři

Ř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.


Linux
  1. Vytváření, mazání a správa adresářů v systému Linux

  2. Kdy mám použít /dev/shm/ a kdy /tmp/?

  3. Rozdíly mezi /dev/sda a /dev/sda1

  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  3. Bash =~ Regex A Https://regex101.com/?

  1. Najít a rozdíly mezi -perm /6000 a -perm /u+s?

  2. Zkopírujte soubory pomocí SCP a Rsync

  3. Nainstalujte binární soubory do /bin, /sbin, /usr/bin a /usr/sbin, interakce s --prefix a DESTDIR