Не удается проверить целостность файлов

Я пишу быстрый скрипт Python для переноса файлов из одного каталога в другой. Все работает отлично, за исключением той части, где мне нужно сравнить имена файлов и контрольную сумму. Я сохранил файл в обоих местах, то есть в /root/src/file1 и /root/dst/file1.

Поэтому, когда я запустил сравнение имен файлов, мне не удалось сопоставить файл, поскольку он включал весь путь к файлу. md5Srt — это диктофон, в котором хранятся файлы и контрольная сумма.

Есть ли способ сравнить имена файлов без использования всего пути к файлу?

for key in md5Srt.keys():
    if key in md5Dst:
        print "keys match " + key
        print '\ncomparing the values of files\n'
        if md5Srt[key] == md5Dst[key]:
            print md5Srt[key]
            print md5Dst[key]
            print "files match\n"
            print "checking the next pair"
        else:
            print "values of files don't match"

person user1773905    schedule 25.10.2012    source источник


Ответы (1)


Если у вас просто куча файлов в каталоге, вы можете просто использовать os.path.basename:

import os
>>> dst = os.path.basename('/root/dst/file1.file')
>>> src =  os.path.basename('/root/src/file1.file')
>>> dst
'file1.file'
>>> src
'file1.file'
>>> dst == src
True

Если вы имеете дело с подкаталогами, вам необходимо знать базовые каталоги src и dst, а затем удалить их из начала каждого пути:

>>> src = '/root/src'
>>> dst = '/root/dst'
>>> src_file = '/root/src/dir1/file1.file'
>>> dst_file = '/root/dst/dir1/file1.file'
>>> os.path.relpath(src_file, src)
'dir1/file1.file'
>>> os.path.relpath(dst_file, dst)
'dir1/file1.file'
>>> os.path.relpath(src_file, src) == os.path.relpath(dst_file, dst)
True

Если вы объедините это с вашей функцией, вы получите:

import os

src = '/root/src'
dst = '/root/dst'
for key, src_file in md5Srt.iteritems():
    dst_file = md5Dst.get(key)
    if dst_file is None:
        print 'The destination is missing %s' src_file
        continue

    print "keys match " + key
    print '\ncomparing the values of files\n'
    if  os.path.relpath(src_file, src) == os.path.relpath(dst_file, dst)
            print srcFile
            print dst_file
            print "files match\n"
            print "checking the next pair"
    else:
            print "values of files don't match"

Я думаю, вам следует переосмыслить попытку сравнения файлов, найдя файл в dst, который имеет ту же сумму md5, что и файл в src. Если файл переименован или есть два файла с одинаковым хэшем, вы можете получить не совсем одинаковые каталоги. Лучшим подходом было бы сначала сравнить имена файлов, а затем проверить md5sums, если есть файл, который находится как в src, так и в dst.

Вот как это может выглядеть:

import os

src_dir = '/root/src'
dst_dir = '/root/dst'

# reverse the dictionaries, hopefully you would create these dictionaries 
# to begin with. A single file can only have one md5sum, but the same md5Sum can 
# match multiple files
src_file_hashes = dict((os.path.relpath(v, src_dir), k) for k, v in md5Srt)
dst_file_hashes = dict((os.path.relpath(v, dst_dir), k) for k, v in md5Dst)

for src_file, src_hash in src_file_hashes.iteritems():
    dst_hash = dst_file_hashes.get(src_file)

    src_path = os.path.join(src_dir, src_file)
    dst_path = os.path.join(dst_dir, dst_file)

    if dst_hash is None:
        print 'The destination file %s is missing ' % dst_path
        continue

    if  src_hash == dst_hash:
        print '%s matches %s and %s' % (src_hash, src_path, dst_path)
    else:
        print '%s and %s have different hashes' % (src_path, dst_path)
person Nathan Villaescusa    schedule 25.10.2012
comment
Спасибо, Натан, это работает... у меня есть еще один вопрос :) .... Как насчет того, когда у меня есть более одного файла в каталогах src и dst. например: /root/src/* & /root/dst/* (file1,file2,file3,cat..etc) ваш метод выше четко извлекает имя файла, но я не могу понять, как извлечь несколько файлов. - person user1773905; 25.10.2012
comment
Я пытался использовать второй подход, который сначала сравнивает имена файлов, а затем контрольную сумму как для src, так и для dst. Однако это сразу не удалось, когда я попытался сравнить имена файлов из-за всего пути к файлу. Я хотел бы разместить свои коды здесь, но это слишком долго :( - person user1773905; 26.10.2012
comment
Как насчет кода, который я только что опубликовал? Это должно проверить вещи другим способом. - person Nathan Villaescusa; 26.10.2012