GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Membandingkan Dua Folder Dan Salin Perbedaannya Ke Folder Ketiga?

Anda memiliki tiga folder:

  • folder saat ini , yang berisi file Anda saat ini
  • folder lama , yang berisi versi lama dari file yang sama
  • folder perbedaan , yang hanya folder kosong

Bagaimana Anda membandingkan lama dengan saat ini dan salin file yang berbeda (atau sama sekali baru) di saat ini untuk berbeda ?

Saya telah mencari di sekitar dan sepertinya hal yang sederhana untuk ditangani, tetapi saya tidak dapat membuatnya bekerja dalam contoh khusus saya. Sebagian besar sumber menyarankan penggunaan rsync jadi saya berakhir dengan perintah berikut:

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

Namun, apa yang dilakukan ini adalah menyalin semua file dari baru untuk berbeda , bahkan yang sama dengan lama .

Jika ini membantu (mungkin perintahnya baik-baik saja dan kesalahannya ada di tempat lain), beginilah cara saya menguji ini:

  1. Saya membuat tiga folder.
  2. Saya membuat beberapa file teks dengan konten yang berbeda di lama .
  3. Saya menyalin file dari lama ke baru .
  4. Saya mengubah konten beberapa file di baru dan menambahkan beberapa file tambahan.
  5. Saya menjalankan perintah di atas dan memeriksa hasilnya di perbedaan .

Saya telah mencari solusi selama beberapa hari terakhir dan saya sangat menghargai bantuan. Itu tidak harus menggunakan rsync, tetapi saya ingin tahu apa yang saya lakukan salah jika memungkinkan.

Jawaban yang Diterima:

Saya tidak yakin apakah Anda dapat melakukannya dengan perintah linux yang ada seperti rsync atau diff. Tetapi dalam kasus saya, saya harus menulis skrip saya sendiri menggunakan Python, karena python memiliki modul "filecmp" untuk perbandingan file. Saya telah memposting seluruh skrip dan penggunaan di situs pribadi saya – http://linuxfreelancer.com/

Penggunaannya sederhana – berikan path absolut dari direktori baru, direktori lama dan direktori perbedaan dalam urutan itu.

#!/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. Hapus file dan folder di terminal Linux

  2. Cara membuka dan menutup direktori di terminal Linux

  3. Perbedaan Antara [[ $a ==Z* ]] Dan [ $a ==Z* ]?

  1. Bagaimana Cara Menulis Jalur Folder Dengan Spasi Di Namanya??

  2. Apa Perbedaan Antara COPY dan ADD di Dockerfiles?

  3. Apa dan bagaimana menggunakan folder public_ftp

  1. Bagaimana cara memindahkan file dan direktori ke folder induk di Linux?

  2. Bagaimana saya bisa menyalin folder dari baris perintah Linux?

  3. perbedaan salin konten folder antara /. dan /* di linux