2010-10-22 3 views
0

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

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

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

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

+0

показать примеры ... – ghostdog74

ответ

0

Это вид, что я сделал, когда я хотел дифф каталоги:

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

Это сделало. благодаря –

0

Вы можете использовать в 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, вы можете сделать ее немного лучше.

0

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

0

Рубин

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))} 
1

Не лучший ли решение rsync? Он поддерживает все, что вы хотите, и делает это быстро.