Синхронизация текстовых файлов — простой скрипт на 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 — за пару минут сделал для скрипта ярлык с иконкой для панели Гнома.
Также исходный текст скрипта доступен, как и всегда, в разделе «Софт«.


