查找已递归更改的文件

时间:2012-05-11 03:37:01

标签: python

我正在尝试编写一个简单的脚本来递归翻录目录并检查是否有任何文件已被更改。到目前为止我只进行了遍历:

import fnmatch
import os 
from optparse import OptionParser

rootPath = os.getcwd() 
pattern = '*.js' 

for root, dirs, files in os.walk(rootPath):    
    for filename in files:        
        print( os.path.join(root, filename))

我有两个问题:

1。如何判断文件是否已被修改?

2。如何检查目录是否已被修改? - 我需要这样做,因为我想要遍历的文件夹是 huge 。如果我可以检查dir是否已被修改而不是递归翻录未更改的目录,那么非常帮助。

谢谢!

4 个答案:

答案 0 :(得分:2)

如果要比较两个文件夹之间的两个文件,可以在两个文件上使用os.path.getmtime()并比较结果。如果它们是相同的,则它们没有被修改。请注意,这将适用于文件和文件夹。

答案 1 :(得分:1)

判断文件是否已被修改的典型快速方法是使用os.path.getmtime(path)(假设Linux或类似环境)。这将为您提供修改时间戳,您可以将其与存储的时间戳进行比较,以确定文件是否已被修改。

getmtime()也适用于目录,但它只会告诉您文件是否已在目录中添加,删除或重命名;它不会告诉你文件是否在目录中被修改过。

答案 2 :(得分:0)

这是我自己实现的你可能正在寻找的东西。请注意,除了时间戳之外,您可能还想跟踪已添加或删除的文件(就像我一样)。如果没有,您可以直接更改代码:

if now == before:

这是代码:

# check if any txt file in folder "wd" has been modified (rewritten added or deleted)
def src_dir_modified(wd):
    now = []
    global before
    all_files = glob.glob(os.path.join(wd,'*.txt'))

    for infile in all_files:
        now.append([infile, os.stat(infile).st_mtime])
    if now == before: # compare files and their time stamps
        return False
    else:
        before = now
        print 'Source code has been modified.'
        return True

答案 3 :(得分:0)

如果您可以承认使用命令行工具,则可以使用rsync而不是重新发明轮子。 rsync使用文件修改时间和文件大小来确定文件是否已更改。

rsync --verbose --recursive --dry-run dir1 dir2应该获得dir1dir2中文件之间的差异。您可以将输出写入日志文件以对其进行操作。