3

У меня есть два файловых дерева. Первый состоит из оригинальных файлов. Второй - дубликат, но в нем отсутствуют правильные метки времени файла, все они установлены на дату последнего дублирования.

Существует ли простой и понятный способ скопировать временные метки файлов из одного дерева в другое, не перенося содержимое файлов снова?

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

3 ответа3

3

Вы можете попробовать с:

cd /path/to/old/directory

find . -exec touch "/path/to/new/directory/{}" --reference "{}" \;

touch --reference someotherfile изменяет дату и время файла, используя someotherfile качестве ссылки.

Если деревья идентичны, то часть {} будет развернута в один и тот же файл в обоих деревьях, а новый префикс каталога сделает все остальное. Вы можете использовать echo вместо touch чтобы убедиться, что ходят правильные файлы.

Конечно, это выполняет touch процесс для каждого файла. Возможно, сценарий Python будет работать более эффективно.

2

Короткий скрипт на python сделает:

#!/usr/bin/python

import os
import sys

for directory,subdirs,files in os.walk('.'):
    pathes=subdirs+files
    for path in pathes:
        fullpath=os.path.join(directory,path)
        target_path=os.path.join(sys.argv[1],fullpath)
        mtime=os.lstat(fullpath).st_mtime
        print 'touching',target_path,':',
        try:
            os.utime(target_path,(mtime,mtime))
            print 'OK'
        except:
            print 'FAILED'

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

python ~/sync_tstamps.py /path/to/target_dir

1

Попробуйте использовать rsync и его --size-only .

rsync -avi --size-only A/ B/

Это должно только проверять размеры файлов и обновлять временные метки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .