任何人都可以建议一个方法(ruby,python或dos更好)只删除两个给定文件夹之间的不同文件和子文件夹?
我需要它通过子目录递归并删除所有不同的东西。
我不想安装任何东西,所以脚本会很棒。
提前致谢
答案 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)
答案 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
请注意,检查常规文件。我似乎记得我遇到过用作信号量的文件,或者是由一个进程写入并由另一个进程读取的文件。事实证明这很重要。
您可以根据自己喜欢的规则添加删除文件的代码。