2010-10-22 61 views
0

任何人都可以請建議一種方法(ruby,python或dos優先)只刪除兩個給定文件夾之間的不同文件和子文件夾?刪除兩個文件夾之間的差異

我需要它通過子目錄遞歸併刪除所有不同的東西。

我不想安裝任何東西,所以腳本會很棒。

在此先感謝

+0

顯示示例... – ghostdog74 2010-10-22 13:59:25

回答

0

這是當我想diff的目錄,我也做了這樣的事情:

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

這樣做。謝謝 – 2010-10-26 10:13:18

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是不是更好的解決方案?它支持你想要的一切並快速完成。