Удалить различия между двумя папками - PullRequest
0 голосов
/ 22 октября 2010

Может ли кто-нибудь предложить метод (предпочтительно ruby, python или dos) для удаления только разных файлов и подпапок между двумя указанными папками?

Мне нужно, чтобы он просматривал подкаталоги и удалял все, что отличается.

Я не хочу ничего устанавливать, поэтому сценарий будет великолепен.

Заранее спасибо

Ответы [ 5 ]

1 голос
/ 22 октября 2010

Разве Rsync не будет лучшим решением?Он поддерживает все, что вы хотите, и делает это быстро.

0 голосов
/ 22 октября 2010

Это то, что я сделал, когда хотел посмотреть каталоги:

#!/usr/bin/env python

import os, os.path
import stat

def traverse_path(start_dir='.'):
    for root, dirs, files in os.walk(start_dir, topdown=False):
        for f in files:
            complete_path = os.path.join(root, f)
            try:
                m = os.stat(complete_path)[stat.ST_MODE]
                if stat.S_ISREG(m):
                    yield complete_path[len(start_dir):]
            except OSError, err:
                print 'Skipping', complete_path
            except IOError, err:
                print 'Skipping', complete_path

if __name__ == '__main__':
    s = set(traverse_path('/home/hughdbrown'))
    t = set(traverse_path('/home.backup/hughdbrown'))
    for e in s - t:
        print e
    print '-' * 25
    for e in t - s:
        print e

Обратите внимание, что есть проверка для обычных файлов. Кажется, я вспоминаю, что сталкивался с файлами, которые использовались как семафоры или которые были записаны одним процессом и прочитаны другим или чем-то еще. Это оказалось важным.

Вы можете добавить код для удаления файлов в соответствии с любыми правилами.

0 голосов
/ 22 октября 2010

В Python вы можете получить имена файлов, используя os.walk. Введите каждый полный путь в set и используйте метод difference, чтобы получить разные файлы и папки.

0 голосов
/ 22 октября 2010

Рубин

folder1=ARGV[0]
folder2=ARGV[1]
f1=Dir["#{folder1}/**"].inject([]){|r,f|r<<File.basename(f)}
Dir["#{folder2}/**"].each{|f2|File.unlink(f2) if not f1.include?(File.basename(f2))}
0 голосов
/ 22 октября 2010

Вы можете использовать Python difflib , чтобы указать, какие файлы отличаются, а затем os.unlink их.Действительно, если все, что вам нужно, это сказать, отличаются ли файлы вообще, вы можете просто сравнить их текст с:

for file1, file2 in files:
    f1 = open(file1, 'r').read()
    f1.close()
    f2 = open(file2, 'r').read()
    f2.close()
    if f1 != f2:
        os.unlink(file1)
        os.unlink(file2)

Вы можете использовать os.walk, чтобы получить списки файлов.Приведенный выше код написан без новых вещей, таких как with, так как вы не хотели устанавливать вещи.Если у вас есть новая установка Python, вы можете сделать ее немного лучше.

...