Làm thế nào để bạn so sánh hai thư mục và sao chép sự khác biệt sang một thư mục thứ ba?


23

Bạn đã có ba thư mục:

  • thư mục hiện tại , chứa các tập tin hiện tại của bạn
  • thư mục , chứa phiên bản cũ hơn của cùng một tệp
  • thư mục khác biệt , chỉ là một thư mục trống

Làm thế nào để bạn so sánh với hiện tại và sao chép các tệp khác nhau (hoặc hoàn toàn mới) trong hiện tại để khác biệt ?


Tôi đã tìm kiếm xung quanh và có vẻ như là một điều đơn giản để giải quyết, nhưng tôi không thể làm cho nó hoạt động trong ví dụ cụ thể của mình. Hầu hết các nguồn đề xuất sử dụng rsync vì vậy tôi đã kết thúc bằng lệnh sau:

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

Tuy nhiên, điều này làm là sao chép tất cả các tệp từ mới sang khác , ngay cả những tệp giống như .

Trong trường hợp nó có ích (có thể lệnh vẫn ổn và lỗi nằm ở chỗ khác), đây là cách tôi đã kiểm tra điều này:

  1. Tôi đã thực hiện ba thư mục.
  2. Tôi đã tạo một số tệp văn bản với nội dung khác nhau .
  3. Tôi đã sao chép các tập tin từ sang mới .
  4. Tôi đã thay đổi nội dung của một số tệp mới và thêm một vài tệp bổ sung.
  5. Tôi chạy lệnh trên và kiểm tra kết quả khác nhau .

Tôi đã tìm kiếm một giải pháp trong vài ngày qua và tôi thực sự đánh giá cao sự giúp đỡ nào đó. Không nhất thiết phải sử dụng rsync, nhưng tôi muốn biết mình đang làm gì sai nếu có thể.



@wingedsubmariner Tôi không nghĩ đó là một bản sao, vì câu trả lời được chấp nhận tại câu hỏi được liên kết, là lệnh mà OP đang hỏi một câu hỏi.
Bernhard

@Bernhard Ah, xấu của tôi. Tôi đoán tôi đã hiểu nhầm câu hỏi ban đầu.
wingbedubmariner

@wingedsubmariner Không phải lo lắng, bạn đã nói "có thể" và tôi đồng ý rằng nó trông rất giống nhau :)
Bernhard

Câu trả lời:


7

Tôi không chắc liệu bạn có thể làm điều đó với bất kỳ lệnh linux nào hiện có như rsync hoặc diff hay không. Nhưng trong trường hợp của tôi, tôi đã phải viết kịch bản của riêng mình bằng Python, vì python có mô-đun "filecmp" để so sánh tệp. Tôi đã đăng toàn bộ tập lệnh và cách sử dụng trong trang cá nhân của mình - http: // linuxfreiên.com/

Cách sử dụng rất đơn giản - cung cấp cho nó đường dẫn tuyệt đối của thư mục mới, thư mục cũ và thư mục khác biệt theo thứ tự đó.

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

21

Tôi đã tìm ra vấn đề trong trường hợp của tôi:

Các tập tin tôi đang so sánh có dấu thời gian khác nhau. Tôi không nên sử dụng đối số -a , tôi giả sử vì rsync đang cố gắng duy trì dấu thời gian khi sao chép tệp. Lệnh làm việc cho tôi là:

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

Tôi nghĩ để kiểm tra điều này với tùy chọn -a (lưu trữ), bạn nên sử dụng rsync -ađể "sao chép" các tệp ban đầu (hoặc cp tương đương), sau đó xóa hoặc sửa đổi. (Tôi thích gắn bó với rsync vì tôi biết nó tự ổn định mà không cần suy nghĩ về những gì nó có thể làm.) Tôi nghĩ rằng nó nên hoạt động với lệnh ban đầu. Tùy chọn -a bao gồm -t (so sánh bằng dấu thời gian), là lựa chọn thay thế cho -c (so sánh bằng tổng kiểm tra).
hiền nhân

2
Theo tôi, câu trả lời này nên được chấp nhận, vì nó đơn giản hơn nhiều. Ngoài ra, lệnh chỉ hoạt động cho tôi khi tôi cung cấp đường dẫn đầy đủ cho old/new/.
Yamaneko

Sự cảnh báo dường như là số phận so sánh phải là con đường tương đối đến sự khác biệt như được thấy từ bên trong số phận thực tế
Ryan Williams

1

Điều này có thể giúp một số độc giả: Trong Windows, một chương trình phần mềm miễn phí cũ hơn, ít thứ ba - thực hiện chính xác những gì đang được yêu cầu ở đây. Nó không còn có sẵn thông qua nhà phát triển, Robert Vašíček. Nhưng tôi chắc chắn rằng nó có thể được tìm thấy thông qua một số kho lưu trữ trực tuyến.

Đây là mô tả của nhà phát triển, vẫn còn trên trang web của anh ấy:

Dir thứ ba: Một trình đồng bộ hóa thư mục bất thường - các tệp khác nhau được sao chép vào thư mục thứ ba. Rất hữu ích để trích xuất ví dụ: ảnh mới hoặc ảnh đã chỉnh sửa từ cây thư mục lớn trên đĩa cố định vào thư mục tạm thời, sau đó thêm chúng vào lưu trữ CD (lưu ý - các tệp gốc được so sánh với CD). Phiên bản 1.4, kích thước 23kB. Tạo 2005/02/12.

Lịch sử: Phiên bản 1.14 - Hiệu quả hơn khi so sánh nhiều mười nghìn tệp.


0

Cách rsync được đưa ra bởi Thane với bổ sung Yamaneko hoạt động rất tốt nhưng để lại các thư mục trống. Đối với tôi, giải pháp cuối cùng là hai bước, đầu tiên gọi rsync với đường dẫn đầy đủ, sau đó là lệnh find để xóa tất cả các thư mục trống:

rsync -rvcm --compare-dest=/tmp/org/ /tmp/new/ /tmp/difference/
find /tmp/difference/ -d -type d -empty -exec rmdir {} \; -print

Xin lưu ý hơn cả với tùy chọn --links, rsync không giữ liên kết tượng trưng mà thay vào đó sao chép dữ liệu đích.


Lưu ý rằng thay vì -empty -exec rmdir {} \;bạn có thể sử dụng -empty -delete.
mivk

-3

Tôi sử dụng dualpane XY Explorer (thương mại), có thể thực hiện nhiều thủ thuật và đây là một trong số đó. Mở Currenttrong một khung và Cũ trong cửa sổ khác. Kích hoạt khung hiện tại. Chuyển đến Panes > Sync Chọn. Nó cung cấp cho bạn 5 tùy chọn để chọn:

  1. Các trận đấu (được liệt kê trong cả hai)
  2. Uniqu (trong khung hoạt động)
  3. Mới hơn (trong khung hoạt động)
  4. Các tệp duy nhất và mới hơn (trong ngăn hoạt động)
  5. Đã chọn (những người được chọn trong khung khác)

Bây giờ bạn có thể sao chép lựa chọn kết quả từ Currentnơi bạn muốn. Tôi đã sử dụng nó để so sánh mailfolderstừ các bản cài đặt cũ với bản mới nhất. Cấu trúc thư mục khá phức tạp, nhưng (hầu hết) đều mbs-filescó một số duy nhất.

Vì vậy, tôi đã thực hiện tìm kiếm mbs-filestrong thư mục gốc cũ mailfolder(trong một ngăn) cũng như trên mới nhất (trong ngăn khác) và so sánh kết quả tìm kiếm trong mỗi ngăn ( Đồng bộ hóa Chọn duy nhất , để tìm thư bị mất trong thời gian cài đặt lại)! Bạn có thể thiết lập rất nhiều tùy chọn quá.


1
Nếu bạn đang nói về phần mềm không chuẩn, bạn nên bao gồm một liên kết. Nếu bạn có nghĩa là XYplorer sẽ không giúp OP chút nào.
Anthon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.