Files

您如何比較兩個文件夾並將差異複製到第三個文件夾?

  • April 26, 2021

你有三個文件夾:

  • 文件夾current,其中包含您目前的文件
  • 文件夾old,其中包含相同文件的舊版本
  • 文件夾差異,只是一個空文件夾

您如何比較的和目前的並將****目前不同(或全新)的文件複製到差異


我已經四處搜尋,這似乎是一件容易解決的事情,但在我的特定範例中我無法讓它工作。大多數消息來源建議使用rsync所以我最終得到了以下命令:

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

然而,這樣做是將所有文件從新文件複製到差異文件,即使是與文件相同的文件。

如果它有幫助(也許命令很好,而故障出在其他地方),這就是我測試它的方式:

  1. 我做了三個文件夾。
  2. 我在old中製作了幾個內容不同的文本文件。
  3. 我將文件從old複製到new
  4. 我更改了一些文件的內容並添加了一些附加文件。
  5. 我執行了上面的命令並檢查了不同的結果。

過去幾天我一直在尋找解決方案,非常感謝一些幫助。它不一定必須使用 rsync,但如果可能的話,我想知道我做錯了什麼。

我不確定您是否可以使用任何現有的 linux 命令(例如 rsync 或 diff)來執行此操作。但就我而言,我必須使用 Python 編寫自己的腳本,因為 python 具有用於文件比較的“filecmp”模組。我已經在我的個人網站上發布了整個腳本和用法 - http://linuxfreelancer.com/

它的用法很簡單——按順序給它新目錄、舊目錄和差異目錄的絕對路徑。

#!/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()

我已經弄清楚我的問題是什麼:

我正在比較的文件有不同的時間戳。我不應該使用**-a**參數,我認為是因為 rsync 在復製文件時試圖保留時間戳。對我有用的命令是:

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

引用自:https://unix.stackexchange.com/questions/104185