GNU/Linux >> Znalost Linux >  >> Linux

Jak porovnat dvě složky a zkopírovat rozdíl do třetí složky?

Máte tři složky:

  • složka aktuální , který obsahuje vaše aktuální soubory
  • složka stará , který obsahuje starší verzi stejných souborů
  • rozdíl složky , což je jen prázdná složka

Jak porovnáváte staré s aktuálním a zkopírujte soubory, které jsou odlišné (nebo zcela nové) do aktuálního k rozdílu ?

Hledal jsem všude kolem a zdá se, že je to jednoduchá věc, kterou lze vyřešit, ale nemohu to přimět, aby to fungovalo v mém konkrétním příkladu. Většina zdrojů navrhla použití rsync takže jsem skončil s následujícím příkazem:

rsync -ac --compare-dest=../old/ new/ difference/

Co to však dělá, je zkopírování všech souborů z nového k rozdílu , dokonce i ty, které jsou stejné jako ve starém .

V případě, že to pomůže (možná je příkaz v pořádku a chyba je jinde), testoval jsem to takto:

  1. Vytvořil jsem tři složky.
  2. Vytvořil jsem několik textových souborů s různým obsahem ve starém .
  3. Zkopíroval jsem soubory ze starého na nové .
  4. Změnil jsem obsah některých souborů v novém a přidal několik dalších souborů.
  5. Spustil jsem výše uvedený příkaz a zkontroloval výsledky v rozdílu .

Posledních pár dní jsem hledal řešení a opravdu bych ocenil nějakou pomoc. Nemusí to nutně používat rsync, ale rád bych věděl, co dělám špatně, pokud je to možné.

Přijatá odpověď:

Nejsem si jistý, zda to můžete udělat s některými existujícími linuxovými příkazy, jako je rsync nebo diff. Ale v mém případě jsem musel napsat svůj vlastní skript pomocí Pythonu, protože python má modul „filecmp“ pro porovnání souborů. Celý skript a použití jsem zveřejnil na své osobní stránce – http://linuxfreelancer.com/

Jeho použití je jednoduché – uveďte absolutní cestu nového adresáře, starého adresáře a rozdílového adresáře v tomto pořadí.

#!/usr/bin/env python

import os, sys
import filecmp
import re
from distutils import dir_util
import shutil

holderlist = []


def compareme(dir1, dir2):
    dircomp = filecmp.dircmp(dir1, dir2)
    only_in_one = dircomp.left_only
    diff_in_one = dircomp.diff_files
    dirpath = os.path.abspath(dir1)
    [holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in only_in_one]
    [holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in diff_in_one]
    if len(dircomp.common_dirs) > 0:
        for item in dircomp.common_dirs:
            compareme(
                os.path.abspath(os.path.join(dir1, item)),
                os.path.abspath(os.path.join(dir2, item)),
            )
        return holderlist


def main():
    if len(sys.argv) > 3:
        dir1 = sys.argv[1]
        dir2 = sys.argv[2]
        dir3 = sys.argv[3]
    else:
        print "Usage: ", sys.argv[0], "currentdir olddir difference"
        sys.exit(1)

    if not dir3.endswith("/"):
        dir3 = dir3 + "/"

    source_files = compareme(dir1, dir2)
    dir1 = os.path.abspath(dir1)
    dir3 = os.path.abspath(dir3)
    destination_files = []
    new_dirs_create = []
    for item in source_files:
        destination_files.append(re.sub(dir1, dir3, item))
    for item in destination_files:
        new_dirs_create.append(os.path.split(item)[0])
    for mydir in set(new_dirs_create):
        if not os.path.exists(mydir):
            os.makedirs(mydir)
    # copy pair
    copy_pair = zip(source_files, destination_files)
    for item in copy_pair:
        if os.path.isfile(item[0]):
            shutil.copyfile(item[0], item[1])


if __name__ == "__main__":
    main()

Linux
  1. Odstraňte soubory a složky v terminálu Linux

  2. Jak otevírat a zavírat adresáře v terminálu Linux

  3. Jak napsat cestu ke složce s mezerou v jejím názvu?

  1. Jak zkopírovat cestu k aktuálnímu adresáři v Ubuntu 18.04?

  2. Jaký je rozdíl mezi COPY a ADD v Dockerfiles?

  3. Co je a jak používat složku public_ftp

  1. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  2. Jak mohu zkopírovat složku z příkazového řádku systému Linux?

  3. rozdíl kopírovat obsah složky mezi /. a /* v linuxu