其實無論windows還是linux,簡單地去實現兩個兩個資料夾的同步只需系統自帶的複製命令加引數就可以了。
xcopy 源資料夾\* 目標資料夾 /s /e /y
cp -r 源資料夾/*這裡使用python來實現這些基本功能,並增加一些去重之類的增強功能。目標資料夾
要想同步兩個資料夾中的資料,基本思路首先需要遍歷源資料夾中的資訊,將源資料夾中的檔案複製到目標資料夾。
遍歷資料夾採用os中的listdir函式就可以了。
1但是很明顯這裡沒有考慮源資料夾中還會存在資料夾甚至多重資料夾的情況。importos2
3 path_s = '
f:\\test\\s
'4 path_t = '
f:\\test\\t'5
6for filename in
os.listdir(path_s):
7 filename_s = path_s+os.sep+filename
8print
'[*] source :
',filename_s
9 filename_t = path_t+os.sep+filename
10print
'[*] target :
',filename_t
11 with open(filename_s,'rb'
) as f_s:
12 with open(filename_t,'wb'
) as f_t:
13 f_t.write(f_s.read())
乙個簡單的思路就是:在遍歷源資料夾內的檔案時,先判定當前檔案這是檔案還是資料夾。如果當前檔案是資料夾的話,開始遍歷此資料夾內的檔案,如果裡面還有資料夾,遍歷這個資料夾,依次類推。利用遞迴的方法,**如下:
1目前,簡單的資料夾複製功能已經實現了。importos2
34 path_s = '
f:\\test\\s
'5 path_t = '
f:\\test\\t'6
78defcopy_file(paths,patht):
9for filename in
os.listdir(paths):
10 filename_s = paths+os.sep+filename
11 filename_t = patht+os.sep+filename
12if
os.path.isdir(filename_s):
13if
notos.path.exists(filename_t):
14os.mkdir(filename_t) #在目標資料夾中建立對應的資料夾
15copy_file(filename_s,filename_t) # 遞迴
16else:17
'[*] source :
',filename_s
1819
'[*] target :
',filename_t
20 with open(filename_s,'rb'
) as f_s:
21 with open(filename_t,'wb'
) as f_t:
22f_t.write(f_s.read())
2324
25 copy_file(path_s,path_t)
乙個簡單的方法就是在目標資料夾中複製檔案之前先利用函式「os.path.exists」判定這個檔案是否存在。
1這個辦法避免了一部分已有檔案的重複複製操作,減少了部分不必要的讀寫操作,但是卻無法消除內容相同但名稱、路徑不同的重複檔案。importos2
34 path_s = '
f:\\test\\s
'5 path_t = '
f:\\test\\t'6
7def
copy_file(paths,patht):
8for filename in
os.listdir(paths):
9 filename_s = paths+os.sep+filename
10 filename_t = patht+os.sep+filename
11if
os.path.isdir(filename_s):
12if
notos.path.exists(filename_t):
13os.mkdir(filename_t)
14copy_file(filename_s,filename_t)
15else:16
ifos.path.exists(filename_t):
17print
'[*] "%s" already exists!
' %filename_t
18else:19
'[*] source :
',filename_s
2021
'[*] target :
',filename_t
22 with open(filename_s,'rb'
) as f_s:
23 with open(filename_t,'wb'
) as f_t:
24f_t.write(f_s.read())
2526 copy_file(path_s,path_t)
目前判定兩個檔案是否相同,除了按位元組逐個對比這個笨方法外,簡單常用的辦法就是利用md5和crc校驗,或是按一定規律挑取檔案的指定位置的資料塊就行對比。
這次利用檔案的md5值,將目標資料夾中已有檔案的md5值儲存到列表或字典中,每在源資料夾中讀取乙個檔案就判定該檔案的md5值是否已經存在於md5列表,沒有的話再進行複製操作,並將該檔案的md5值寫入列表。
import如下圖,執行後內容相同的幾個檔案,只有第一次讀取到的時候才寫入目標資料夾,其他路徑下的檔案並沒有複製到目標資料夾。osimport
hashlib
path_s = '
f:\\test\\s
'path_t = '
f:\\test\\t
'list_file ={}
defcreate_file_list(path):
for name in
os.listdir(path):
filename = path+os.sep+name
ifos.path.isdir(filename):
create_file_list(filename)
else
: with open(filename,'rb
') as f:
md5 =hashlib.md5(f.read()).hexdigest()
if md5 not
inlist_file:
list_file[md5] = 1
defcopy_file(paths,patht):
for filename in
os.listdir(paths):
filename_s = paths+os.sep+filename
filename_t = patht+os.sep+filename
ifos.path.isdir(filename_s):
ifnot
os.path.exists(filename_t):
os.mkdir(filename_t)
copy_file(filename_s,filename_t)
else
:
ifos.path.exists(filename_t):
'[*] "%s" already exists!
' %filename_t
else
: with open(filename_s,'rb
') as f_s:
data =f_s.read()
file_md5 =hashlib.md5(data).hexdigest()
if file_md5 not
inlist_file:
list_file[file_md5] = 1
'[*] source :
',filename_s
'[*] target :
',filename_t
with open(filename_t,'wb
') as f_t:
f_t.write(data)
else
:
'[*] "%s"\'s md5 already exists!
' %filename_t
create_file_list(path_t)
copy_file(path_s,path_t)
matlab 比較兩個資料夾內CSV資料夾
比較兩個資料夾的檔名,不同則刪除 比較兩個資料夾下檔名,輸出檔案不同的檔名 stra strb str11 stra,csv jiegou1 dir str11 等價於下面這行 geshu1 length jiegou1 str12 strb,csv jiegou2 dir str12 等價於下面這...
使用diff比較兩個資料夾
最近經常的要比較不同版本的原始檔,由於檔案比較多,比較想通過兩個目錄的比較直接得到,版本之間的不同之處,開始使用beyond compare,感覺很好用,但是不太習慣紅色的配色,又比較懶惰的不想更改配色,所以選擇了使用diff配合vim的方法來檢視檔案的不同。經過檢視diff的幫助說明,得到下面的命...
使用diff比較兩個資料夾
diff c a r b x bak a b ab.diff c 採用content的format輸出different a 強制使用text的模式 r 遞迴到子目錄裡去 b 忽略空白的不同 x 過濾掉所比較目錄中一些不想比較的檔案型別,可以使用其他的pattern 實際上如果需要過濾的檔案型別比較...