Синхронизация текстовых файлов – простой скрипт на Perl

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

Решил набросать простейший скрипт на Perl (поскольку перл есть у меня и дома, и на работе, в отличие от баша например), который бы проходил по указанным мной файлам и синхронизировал их опираясь на дату последнего изменения, иными словами – более свежие файлы будут заменять устаревшие.

Сказано – сделано. Скрипт сравнивает пары файлов, перечисленных в хэше в теле самого скрипта и при необходимости производит синхронизацию. Текст скрипта приведён ниже, может пригодится кому-то помимо меня:


#!/usr/bin/perl
#=================================================
# DESCRIPTION: Примитивный скрипт для попарной синхронизации указанных списком
# ТЕКСТОВЫХ файлов. Синхронизация производится на основании времени
# последнего изменения файла.
#
# USAGE: Вручную внести в список %files пары файлов, между которыми должна
# выполняться синхронизация и запустить скрипт.
#
# AUTHOR: dimio
# URL: https://dimio.org
# VERSION: 0.1
# CREATED: 2010-07-08
#=================================================
require 5.8.8;
use warnings;
use strict;
use encoding 'utf8', STDOUT => 'utf8';
our $VERSION = '0.1';

# Пары файлов для синхронизации указывать в списке ниже
# !правильность ввода имён как и само существование файлов не проверяются!
my %files = (
'/cygdrive/e/tst1/doc_accounting.odb' => './tst2/database.odb',
'/cygdrive/e/tst1/table.ods' => './tst2/file_for_test.ods',
# и так далее до победного
);

# Процесс пошел...
foreach my $file (keys %files) {

if ( (stat($file))[9] > (stat($files{$file}))[9] ) { # если первый файл изменён позже второго - обновить второй

open (FROM, '< ', $file) or die "Can't open $file\n"; my @tmp = ;
close (FROM);

open (TO, '>', $files{$file}) or die "Can't open $files{$file}\n";
print TO @tmp;
close (TO);

print '-> '.$files{$file}.' is updated from '.$file,"\n";
}

elsif ( (stat($file))[9] < (stat($files{$file}))[9] ) { # если второй позже первого - обновить первый open (FROM, '<', $files{$file}) or die "Can't open $files{$file}\n"; my @tmp = ;
close (FROM);

open (TO, '>', $file) or die "Can't open $file\n";
print TO @tmp;
close (TO);

print '< - '.$file.' is updated from ',$files{$file},"\n"; } else { print '= updating not required',"\n"; } # иначе обновление не требуется # впрочем в обычных условиях под Windows время изменения всегда различается на миллисекунды } exit 0;

P.S. Кстати, в очередной раз порадовался тому, что пользуюсь Linux - за пару минут сделал для скрипта ярлык с иконкой для панели Гнома.
Также исходный текст скрипта доступен, как и всегда, в разделе "Софт".

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *