Как копировать файлы, только если источник новее, чем место назначения в Python? - PullRequest
8 голосов
/ 15 февраля 2010

Я пишу скрипт для копирования скомпилированных файлов из одного места в другое.

То, что у меня сейчас есть, примерно так:

import os
import shutil

shutil.copy2 (src, dst)
#... many more shutil.copy commands
#src is a filename string
#dst is the directory where the file is to be copied

Моя проблема в том, что многие из копируемых файлов являются большими файлами, и не все они перекомпилируются в каждом цикле компиляции. В идеале я хотел бы скопировать только измененные файлы в этом скрипте. Есть ли способ, которым я могу сделать это?

Ответы [ 7 ]

12 голосов
/ 15 февраля 2010

Вы можете использовать время модификации файла, если вам этого достаточно:

# If more than 1 second difference
if os.stat(src).st_mtime - os.stat(dest).st_mtime > 1:
    shutil.copy2 (src, dst)

Или вызвать инструмент синхронизации, например rsync.

9 голосов
/ 27 мая 2015

Вы можете сделать смарт-копию, используя distutils.file_util.copy_file , задав необязательный аргумент: update=1.

Существует также версия, которая копирует целые каталоги с distutils.dir_util.copy_tree.

Затем вы можете убедиться, что любой из них действительно работает и копирует только необходимые файлы , включив ведение журнала :

import distutils.log
import distutils.dir_util

distutils.log.set_verbosity(distutils.log.DEBUG)
distutils.dir_util.copy_tree(
    src_dir,
    dst_dir,
    update=1,
    verbose=1,
)

который печатает, какие файлы были скопированы.

4 голосов
/ 15 февраля 2010

Если у вас нет определенной причины для необходимости самостоятельно кодировать это на python, я бы предложил использовать rsync. С его man-страницы:

Rsync быстрый и необычайно универсальный инструмент для копирования файлов. это славится своим дельта-трансфером алгоритм, который уменьшает количество данные, отправленные по сети путем отправки только различия между исходные файлы и существующие файлы в пункт назначения.

Однако, если вы хотите закодировать это на Python, то начинать следует с изучения filecmp.cmp

4 голосов
/ 15 февраля 2010

вы можете попробовать эту реализацию Python для rsync

http://freshmeat.net/projects/pysync/

1 голос
/ 26 июля 2017

Чтобы построить ответ AndiDog, если у вас есть файлы, которые могут отсутствовать в папке назначения:

# copy file if destination is older by more than a second, or does not exist
if (not os.path.exists(dest)) or (os.stat(src).st_mtime - os.stat(dest).st_mtime > 1) :
    shutil.copy2 (src, dest)
1 голос
/ 29 января 2012

Из ответа AndiDog:

os.stat(dst).st_mtime - os.stat(src).st_mtime

является отрицательным значением, если файл 'src' новее, поэтому оно должно быть:

if os.stat(src).st_mtime - os.stat(dst).st_mtime > 1:
1 голос
/ 15 февраля 2010

Как бы вы хотели искать измененные файлы?Вы можете просто использовать os.path.getmtime (path) в src и проверить, является ли это новее, чем сохраненная временная метка (например, когда вы последний раз копировали), или использовать filecmp.cmp (f1, f2 [, мелкий]) для проверкиявляется ли файл более новым.

Следите за файлом filecmp.cmp, вы также копируете статистику (copy2), поэтому вам нужно проверить, подходит ли вам небольшое сравнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...