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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/perl
#=================================================
#  DESCRIPTION:  Примитивный скрипт для попарной синхронизации указанных списком
#                ТЕКСТОВЫХ файлов. Синхронизация производится на основании времени
#                последнего изменения файла.
#
#        USAGE:  Вручную внести в список %files пары файлов, между которыми должна
#                выполняться синхронизация и запустить скрипт.
#
#       AUTHOR:  dimio
#          URL:  http://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 = <FROM>;
        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 = <FROM>;
        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 — за пару минут сделал для скрипта ярлык с иконкой для панели Гнома.
Также исходный текст скрипта доступен, как и всегда, в разделе «Софт«.



Category Рубрики: *NIX, Кодинг | Tag Метки: , , , | Comments Комментариев нет »

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