删除两个文件夹之间的差异

时间:2010-10-22 13:51:28

标签: python ruby dos

任何人都可以建议一个方法(ruby,python或dos更好)只删除两个给定文件夹之间的不同文件和子文件夹?

我需要它通过子目录递归并删除所有不同的东西。

我不想安装任何东西,所以脚本会很棒。

提前致谢

5 个答案:

答案 0 :(得分:1)

rsync不是更好的解决方案吗?它支持您想要的一切并快速完成。

答案 1 :(得分: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安装,你可以使它更好。

答案 2 :(得分:0)

在Python中,您可以使用os.walk获取文件名。将每个完整路径名放入set并使用difference方法获取不同的文件和文件夹。

答案 3 :(得分: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))}

答案 4 :(得分: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

请注意,检查常规文件。我似乎记得我遇到过用作信号量的文件,或者是由一个进程写入并由另一个进程读取的文件。事实证明这很重要。

您可以根据自己喜欢的规则添加删除文件的代码。