西湖鱼 发表于 2018-8-9 11:04:44

Python同步文件

  最近在做Python开发,研究了技术大牛写的脚本,在他的脚本上做了优化。优化脚本已在做过测试还是挺好用的,如果你觉得不错就直接拿到生产用吧。
  先直接放代码出来:
  ---------------------------------------------------------------------------------------------------------
  import re,shutil,os,sys,filecmp
  diffFilesList = []
  def commpare(dir1,dir2):
  cmpobs=filecmp.dircmp(dir1,dir2)
  dir1_only=cmpobs.left_only
  dir1_diff=cmpobs.diff_files
  
  
  if len(cmpobs.common_dirs) > 0:
  for a in cmpobs.common_dirs:
  commpare(os.path.abspath(os.path.join(dir1,a)),os.path.abspath(os.path.join(dir2,a)))
  return diffFilesList
  def main():
  if len(sys.argv) < 3:
  print "Plese use %s sourcedir backdir" % sys.argv
  sys.exit()
  else:
  dir1=os.path.abspath(sys.argv)
  dir2=os.path.abspath(sys.argv)
  ifMakeDir = True
  while ifMakeDir:
  diffFilesList = []
  destinationFiles = []
  ifMakeDir=False
  sourceFiles=commpare(dir1,dir2)
  for a in sourceFiles:
  destinationFile=re.sub(dir1,dir2,a)
  destinationFiles.append(destinationFile)
  if os.path.isdir(a):
  if not os.path.exists(destinationFile):
  os.makedirs(destinationFile)
  print "Make dir %s" % destinationFile
  ifMakeDir=True
  destinationFiles = []
  sourceFiles=[]
  sourceFiles=commpare(dir1,dir2)
  [ destinationFiles.append(re.sub(dir1,dir2,a)) for a in sourceFiles]
  for a,b in zip(sourceFiles,destinationFiles):
  if os.path.isfile(a):
  print "Copy file %s to %s" % (a,b)
  shutil.copyfile(a,b)
  #print sourceFiles,destinationFiles
  if __name__ == '__main__':
  main()
  ---------------------------------------------------------------------------------------------------------
  直接看效果:
  # pwd
  /tmp
  # tree testsyncfile/
  testsyncfile/
  ├── destinationfiles
  └── sourcefiles
  ├── file
  └── test1
  ├── file1
  └── test2
  ├── file2
  └── test3
  5 directories, 3 files
  # python syncfile.py /tmp/testsyncfile/sourcefiles testsyncfile/destinationfiles/
  Make dir /tmp/testsyncfile/destinationfiles/test1
  Make dir /tmp/testsyncfile/destinationfiles/test1/test2
  Make dir /tmp/testsyncfile/destinationfiles/test1/test2/test3
  Copy file /tmp/testsyncfile/sourcefiles/file to /tmp/testsyncfile/destinationfiles/file
  Copy file /tmp/testsyncfile/sourcefiles/file to /tmp/testsyncfile/destinationfiles/file
  Copy file /tmp/testsyncfile/sourcefiles/test1/file1 to /tmp/testsyncfile/destinationfiles/test1/file1
  Copy file /tmp/testsyncfile/sourcefiles/file to /tmp/testsyncfile/destinationfiles/file
  Copy file /tmp/testsyncfile/sourcefiles/test1/file1 to /tmp/testsyncfile/destinationfiles/test1/file1
  Copy file /tmp/testsyncfile/sourcefiles/test1/test2/file2 to /tmp/testsyncfile/destinationfiles/test1/test2/file2
  Copy file /tmp/testsyncfile/sourcefiles/file to /tmp/testsyncfile/destinationfiles/file
  Copy file /tmp/testsyncfile/sourcefiles/test1/file1 to /tmp/testsyncfile/destinationfiles/test1/file1
  Copy file /tmp/testsyncfile/sourcefiles/test1/test2/file2 to /tmp/testsyncfile/destinationfiles/test1/test2/file2
  Copy file /tmp/testsyncfile/sourcefiles/file to /tmp/testsyncfile/destinationfiles/file
  Copy file /tmp/testsyncfile/sourcefiles/test1/file1 to /tmp/testsyncfile/destinationfiles/test1/file1
  Copy file /tmp/testsyncfile/sourcefiles/test1/test2/file2 to /tmp/testsyncfile/destinationfiles/test1/test2/file2
  # tree testsyncfile/
  testsyncfile/
  ├── destinationfiles
  │   ├── file
  │   └── test1
  │       ├── file1
  │       └── test2
  │         ├── file2
  │         └── test3
  └── sourcefiles
  ├── file
  └── test1
  ├── file1
  └── test2
  ├── file2
  └── test3
  8 directories, 6 files
  ----------------------------------------------------------------------------------------------------------
  简单说明下脚本:
  简单说明下脚本,脚本对源数据与目的数据做对比,有差异的文件做替换和新增,对目录做新增。但对于目的数据多余的目录和文件,脚本不错处理。希望使用脚本的人能根据自己的场景灵活运用。
  刚开始写博客,写的比较草率,后续将分享更加生动的文章!
  对于这篇文章大家有疑问或者建议欢迎留言。
页: [1]
查看完整版本: Python同步文件