Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: compare directories

compare directories 10 Χρόνια 2 Εβδομάδες πριν #2383

  • fifli
  • Το Άβαταρ του/της fifli
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 2
geia sas. sygnwmh pou den mporw na grapsw ellhnika alla den to dexetai sto pc mou. grafw se python k uelw na sygrinw arxeia. na blepw an einai ola panomoiotupa k otan den einai na exw ena mnma oti diaferoun ekei k ekei. poia einai h kaluterh me8odos na to kanw? sas parakalw xreiazomai thn boh8eia sas. pws 8a eimai ekato ta ekato sigourh pws mporw na sbhsw ta arxika? mexri twra exw auto:
import os, sys, traceback
import hashlib
import stat
import mmap
import traceback
import multiprocessing
from multiprocessing import Process, JoinableQueue
 
inst_name  = "in14"
dir1="/users/serdon/in14"
dir ="/users/experiment_in14"
 
 
num_procs = multiprocessing.cpu_count()
num_procs *= 4
 
def get_hash(fh, sz):
    h = hashlib.sha1()
    while True:
        buf = fh.read(65536)
        if len(buf) == 0: break
        h.update(buf)
    return h.digest()
 
def chk(path, lf, dir):
    path = os.path.join(dir, path)
    st = None
    st1 = None
    try:
        st = os.lstat(path)
        st1 = os.lstat(path)
    except:
        lf.write("Missing from the copy: " + path + "\n")
        lf.flush()
        return
 
    if not stat.S_ISREG(st.st_mode):
        return
    if st.st_size != st1.st_size:
        lf.write("c.Size differ: " + path + "\n")
        lf.flush()
        return
    if st.st_size == 0: return
 
    hv = None
    hv1 = None
    try:
        fh = open(path, "r")
        hv = get_hash(fh, st.st_size)
        fh.close()
        fh = open(path, "r")
        hv1 = get_hash(fh, st.st_size)
        fh.close()
    except:
        lf.write("c.Open error: " + path + "\n")
        lf.flush()
        return
 
    if hv != hv1:
        lf.write("c.Digests differ: " + path + "\n")
        lf.flush()
 
def proc_chk(q, lf, dir):
    while True:
        path = q.get()
        if path == "done":
            break
        chk(path, lf, dir)
        q.task_done()
    q.task_done()
 
q = JoinableQueue()
lf = open("/var/tmp/differ_files2", "w+")
path = os.path.realpath(sys.argv[0])
path1 = os.path.realpath(sys.argv[1])
 
o_cwd = os.getcwd()
os.chdir(dir)
cwd = os.getcwd()
 
for i in range(0, num_procs):
    p = Process(target=proc_chk, args=(q, lf, dir1))
    p.start()
 
for dirpath, dirnames, filenames in os.walk(".", followlinks=False):
    for f in filenames:
        q.put(os.path.join(dirpath, f))
 
for i in range(0, num_procs):
    q.put("done")
 
q.join()
lf.close()
os.chdir(o_cwd)
 
 
 
###############################################
import os, sys, traceback
import hashlib
import stat
import mmap
import traceback
import multiprocessing
from multiprocessing import Process, JoinableQueue
 
inst_name  = "in14"
dir="/users/serdon/in14"
dir1 ="/users/experiment_in14"
 
 
num_procs = multiprocessing.cpu_count()
num_procs *= 4
 
def get_hash(fh, sz):
    h = hashlib.sha1()
    while True:
        buf = fh.read(65536)
        if len(buf) == 0: break
        h.update(buf)
    return h.digest()
 
def chk(path, lf, dir):
    path1 = os.path.join(dir, path)
    st = None
    st1 = None
    try:
        st = os.lstat(path)
        st1 = os.lstat(path1)
    except:
        lf.write("Missing from the original: " + path1 + "\n")
        lf.flush()
        return
 
    if not stat.S_ISREG(st.st_mode):
        return
    if st.st_size != st1.st_size:
        lf.write("o.Size differ: " + path1 + "\n")
        lf.flush()
        return
    if st.st_size == 0: return
 
    hv = None
    hv1 = None
    try:
        fh = open(path, "r")
        hv = get_hash(fh, st.st_size)
        fh.close()
        fh = open(path1, "r")
        hv1 = get_hash(fh, st.st_size)
        fh.close()
    except:
        lf.write("Open error: " + path1 + "\n")
        lf.flush()
        return
 
    if hv != hv1:
        lf.write("o.Digests differ: " + path1 + "\n")
        lf.flush()
 
 
 
def proc_chk(q, lf, dir):
    while True:
        path1 = q.get()
        if path1 == "done":
            break
        chk(path1, lf, dir)
        q.task_done()
    q.task_done()
 
q = JoinableQueue()
lf = open("/var/tmp/differ_files2", "a+")
path = os.path.realpath(sys.argv[0])
path1 = os.path.realpath(sys.argv[1])
 
o_cwd = os.getcwd()
os.chdir(dir)
cwd = os.getcwd()
 
for i in range(0, num_procs):
    p = Process(target=proc_chk, args=(q, lf, dir1))
    p.start()
 
for dirpath, dirnames, filenames in os.walk(".", followlinks=False):
    for f in filenames:
        q.put(os.path.join(dirpath, f))
 
for i in range(0, num_procs):
    q.put("done")
 
q.join()
lf.close()
os.chdir(o_cwd)
 
 

k leitoyrgei mia xara to 8ema einai pws mou zhthsan me to na elenxw ta koina shmeia me to dircmp and compare trees. poia h gnwmh sas gi auto?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

compare directories 10 Χρόνια 2 Εβδομάδες πριν #2385

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Καλησπέρα,

τώρα δεν έχω χρόνο να το δω πιο αναλυτικά, αλλά δεδομένου ότι εισαι σε *nix, μήπως θα ήταν πιο απλό να καλείς την "diff" και μετά να κάνεις parse το output; Για πιο λόγο να ξανανακαλύψεις τον τρόχο; Πχ
diff /path/to/filaname1 /path/to/filename2
Τσέκαρε το module subprocess για να δεις πως μπορείς να την καλέσεις.

Δουλεύει και με directories
linuxcommando.blogspot.gr/2008/05/compar...g-diff-in-linux.html
Τελευταία διόρθωση: 10 Χρόνια 2 Εβδομάδες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

compare directories 10 Χρόνια 2 Εβδομάδες πριν #2388

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
Αφού το πρόγραμμα δουλεύει μια χαρά γιατί να κάνεις shell escape;
Τέλος πάντων, αν θέλουν εντολές λειτουργικού, κάνε ότι γράφει ο pmav.

Ενδεικτικά:

import subprocess
>>> p = subprocess.Popen(['diff', '/home/km/python_test_files', '/home/km/python_test_files_01'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print(out.decode())
Μόνο στο /home/km/python_test_files_01: check_buttons.py
Μόνο στο /home/km/python_test_files_01: configtestgui.py
Μόνο στο /home/km/python_test_files_01: connectdb.py
Μόνο στο /home/km/python_test_files_01: convert_sql_results_json.py
Μόνο στο /home/km/python_test_files: inserttodromos.py
Οι υποκατάλογοι /home/km/python_test_files/__pycache__ και /home/km/python_test_files_01/__pycache__ είναι ταυτόσημοι
 
>>>

Δεν έχω windows μηχάνημα πρόχειρο, για να το δοκιμάσω.
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

compare directories 10 Χρόνια 2 Εβδομάδες πριν #2389

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
A! και για τα greeklish υπάρχουν online converters!
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": fifli

compare directories 10 Χρόνια 2 Εβδομάδες πριν #2390

  • fifli
  • Το Άβαταρ του/της fifli
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 2
autos den 8elei me thn diff. exei hdh anaptuksei 'kati' xwris bebaia na douleuei me tree equal, match,mismatch,errors, dirs_cmp = filecmp.dircmp(dir1, dir2). pisteuete oti auto to path prepei na akolou8hsw h na anaptyksw perissotero to diko mou pros8etontas 3 basika prahmata pou leipoun. eseis exete paromoio kwdika?
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

compare directories 10 Χρόνια 2 Εβδομάδες πριν #2391

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Για τι πράγμα είναι ο κώδικας; Για δουλειά; Για εργασία στο πανεπιστήμιο; Για εξάσκηση;

Προσωπικά νομίζω ότι το Diff είναι μακράν ο καλύτερος τρόπος. Είναι (μάλλον) πιο γρήγορο από ότιδήποτε θα γράψεις μόνη σου. Είναι (καρα)δοκιμασμένο. Κάνει ακριβώς αυτό που θέλεις.

Από εκεί και πέρα, για σύγκριση directories, νομίζω ότι η filecmp.dircmp() σε καλύπτει. Για σύγκριση αρχείων μάλλον θα χρειαστείς δικό σου κώδικα.

Προσωπικά δεν έχω χρειαστεί κάτι παρόμοιο.

παράκληση: Γράφε με ελληνικά. Τα greeklish είναι πολύ κουραστικά.
Τελευταία διόρθωση: 10 Χρόνια 2 Εβδομάδες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

compare directories 10 Χρόνια 2 Εβδομάδες πριν #2392

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
fifli έγραψε:
autos den 8elei me thn diff. exei hdh anaptuksei 'kati' xwris bebaia na douleuei me tree equal, match,mismatch,errors, dirs_cmp =filecmp.dircmp(dir1, dir2). pisteuete oti auto to path prepei na akolou8hsw h na anaptyksw perissotero to diko mou pros8etontas 3 basika prahmata pou leipoun. eseis exete paromoio kwdika?

Μετατροπή greeklish σε ελληνικά.
Όπως γράφει πολύ σωστά ο pmav99, είναι κουραστικά. Επίσης δεν πιστεύω σε ότι λειτουργικό και να εργάζεσαι να μην μπορείς να εγκαταστήσεις ελληνικά. Δοκίμασε να εγκαταστήσεις.

Αν αυτός για τον οποίο γράφεις τον κώδικα είναι εργοδότης σου και έχει προσωπική άποψη επί του θέματος, κάνε ότι σου υπαγορεύει. Αν τώρα, γράφεις εργασία, ακολούθησε τη δική σου γραμμή, που πρέπει να την αιτιολογήσεις.

eseis exete paromoio kwdika?

Όχι. Παράδειγμα στην τεκμηρίωση της python εδώ.
Γράφω σε Python 3
Τελευταία διόρθωση: 10 Χρόνια 2 Εβδομάδες πριν από kamar. Αιτία: τυπογραφικό
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.284 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου