Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何比较目录以确定哪些文件已更改?_Python_File_Hash_Diff_Rsync - Fatal编程技术网

Python 如何比较目录以确定哪些文件已更改?

Python 如何比较目录以确定哪些文件已更改?,python,file,hash,diff,rsync,Python,File,Hash,Diff,Rsync,我们需要一个脚本来比较两个文件目录,对于在目录1和目录2之间更改的每个文件,添加、删除、修改,只需要创建这些修改文件的子集 我的第一印象是创建一个python脚本来遍历每个目录,计算每个文件的哈希值,如果哈希值发生了变化,则将文件复制到新的文件子集。这是正确的做法吗?我是否忽略了任何可能已经做到这一点的工具?我从来没用过,但也许用了一些可以用的东西 谢谢 编辑: 重要的是,我能够编译只有那些文件被更改的子集-因此,如果只有3个文件在版本之间发生了更改,我只需要将这3个文件复制到一个新目录 这是一

我们需要一个脚本来比较两个文件目录,对于在目录1和目录2之间更改的每个文件,添加、删除、修改,只需要创建这些修改文件的子集

我的第一印象是创建一个python脚本来遍历每个目录,计算每个文件的哈希值,如果哈希值发生了变化,则将文件复制到新的文件子集。这是正确的做法吗?我是否忽略了任何可能已经做到这一点的工具?我从来没用过,但也许用了一些可以用的东西

谢谢

编辑:


重要的是,我能够编译只有那些文件被更改的子集-因此,如果只有3个文件在版本之间发生了更改,我只需要将这3个文件复制到一个新目录

这是一种完全合理的方法,但实际上您正在重新发明rsync。所以,是的,使用rsync


编辑:

我喜欢,它非常适合这个目的。

我觉得你需要这样简单的东西:

from os.path import getmtime
from os import sep,listdir

rep1 = 'I:\\dada'
rep2 = 'I:\\didi'

R1 = listdir(rep1)
R2 = listdir(rep2)


vanished = [ filename for filename in R1 if filename not in R2]
appeared = [ filename for filename in R2 if filename not in R1]
modified = [ filename for filename in ( f for f in R2 if f in R1)
             if getmtime(rep1+sep+filename)!=getmtime(rep2+sep+filename)]


print 'vanished==',vanished
print 'appeared==',appeared
print 'modified==',modified
我修改了一点答案

参数可以如下所示:

python file.py dir1 dir2

注意:根据修改时间排序


谢谢看起来不错,但这对我们来说可能太过分了。。。我们只需要创建一个在不同版本之间更改的所有文件的zip,这样我们的外部用户就可以下载更新的文件并将其解压缩到他们需要的地方。我直到10分钟前才听说rsync,所以我不确定它是否符合我们需要的目的,但在您的评论和进一步研究之后,它可能会出现。谢谢。想一想,我认为我在解释这个问题时做得不好。我真正想要实现的是一个目录,其中只包含那些已更改的文件…@Cuga啊,我明白了,找到了一个邮件列表帖子,显示rsync也可以做到这一点!太棒了,这很有魅力。rsync-av-compare dest=../newfolder oldfolder/changed_文件这里的../和/很重要。我喜欢这样,但不是根据时间判断“修改”,我认为需要对文件进行哈希处理,因为第二个目录中的每个文件都将始终是第一个目录的较新副本。我还需要递归地列出dir。除了使用递归函数调用它们之外,还有其他方法吗?这些项在源代码管理中吗?没有,它们是从我们的构建中输出的。
#!/usr/bin/python
import os, sys,time
from os.path import getmtime
from os import sep,listdir

ORIG_DIR = sys.argv[1]#orig:-->/root/backup.FPSS/bin/httpd
MODIFIED_DIR = sys.argv[2]#modified-->/FPSS/httpd/bin/httpd

LIST_OF_FILES_IN_ORIG_DIR = listdir(ORIG_DIR)
LIST_OF_FILES_IN_MODIFIED_DIR = listdir(MODIFIED_DIR)


vanished = [ filename for filename in LIST_OF_FILES_IN_ORIG_DIR if filename not in LIST_OF_FILES_IN_MODIFIED_DIR]
appeared = [ filename for filename in LIST_OF_FILES_IN_MODIFIED_DIR if filename not in LIST_OF_FILES_IN_ORIG_DIR]
modified = [ filename for filename in ( f for f in LIST_OF_FILES_IN_MODIFIED_DIR if f in LIST_OF_FILES_IN_ORIG_DIR) if getmtime(ORIG_DIR+sep+filename)<getmtime(MODIFIED_DIR+sep+filename)]
same = [ filename for filename in ( f for f in LIST_OF_FILES_IN_MODIFIED_DIR if f in LIST_OF_FILES_IN_ORIG_DIR) if getmtime(ORIG_DIR+sep+filename)>=getmtime(MODIFIED_DIR+sep+filename)]

def print_list(arg):
    for f in arg:
        print '----->',f
    print 'Total :: ',len(arg)

print '###################################################################################################'
print 'Files which have Vanished from MOD: ',MODIFIED_DIR,' but still present ',ORIG_DIR,' ==>\n',print_list(vanished)
print '-----------------------------------------------------------------------------------------------------'
print 'Files which are Appearing in MOD: ',MODIFIED_DIR,' but not present ',ORIG_DIR,' ==>\n',print_list(appeared)
print '-----------------------------------------------------------------------------------------------------'
print 'Files in MOD: ',MODIFIED_DIR,' which are MODIFIED if compared to ORIG: ',ORIG_DIR,' ==>\n',print_list(modified)
print '-----------------------------------------------------------------------------------------------------'
print 'Files in MOD: ',MODIFIED_DIR,' which are NOT modified if compared to ORIG: ',ORIG_DIR,' ==>\n',print_list(same)
print '###################################################################################################'