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:
- Vytvořil jsem tři složky.
- Vytvořil jsem několik textových souborů s různým obsahem ve starém .
- Zkopíroval jsem soubory ze starého na nové .
- Změnil jsem obsah některých souborů v novém a přidal několik dalších souborů.
- 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()