Получение простого списка измененных файлов от унисона

У меня есть файловая система, которая изменяется на двух серверах и также должна копироваться в Amazon S3.

До недавнего времени синхронизация файловой системы между этими двумя серверами с помощью Унисона, и затем копируя в S3 с s3sync.rb была прекрасным решением.

Теперь, когда файловая система составляет почти 50 ГБ, s3sync.rb стал узким местом, поскольку это должно проверить каждый файл на свежесть (мы используем - никакой-md5 флаг).

Таким образом, у меня теперь есть сценарий, который ожидает список файлов, и он обновил бы их и только их с помощью s3cmd.rb

Я ожидал, что мог использовать файл unison.log, чтобы заставить канонический список файлов передавать, но формат его варьируется в зависимости от операции, которая произошла с файлом (новый файл, копия с локальной альтернативы, переименуйте и т.д.).

Может унисон для генерации журнала или списка файлов, которые были изменены кроме оставленного в unison.log?

В данный момент это - то, как я извлекаю список файла из unison.log (я сознательно игнорирую, удаляет),

# Ignore deletes and get the list of new & changed files
grep -v '\[END\] Deleting ' /tmp/unison.log | grep '\[END\]' $unisonlog | sed -re 's/\[END\] (Copying|Updating file) //' > /tmp/changed-files.log

# Files that unison lists as shortcuts are harder as it doesn't always prefix them with their full path
# so before adding them to the log, find the files in the relevant directory
grep 'Shortcut: copying ' /tmp/unison.log | sed -re 's/Shortcut: copying (.*)+ from local file.*/\1/' | while read file
do
  echo "Having to look for $file in source directory"
  find /ebs/src -wholename "*$file" >> /tmp/changed-files.log
done
1
задан 1 March 2013 в 12:33
1 ответ

Одна из идей - использовать stdout , сгенерированный Unison во время его работы. В stdout есть мусор, который Unison использует для создания динамического эффекта в терминале, пока он «ищет изменения». Этот мусор можно довольно легко удалить, удалив каждую строку, содержащую символ возврата каретки (CR) (в vim это будет что-то вроде :% s /^.*^ M. * $ \ N // g где ^ M вводится нажатием Crtl + V , затем Crtl + M ). Результат выглядит примерно так:

         <---- new dir    bar/foo/newdir   
deleted  ---->            bar/user/oldfile1  
deleted  ---->            bar/user/oldfile2  
         <---- new file   foobar/test/quiz.txt
         <---- changed    foobar/test/quiz.txt

Это намного легче проанализировать, чем журнал Unison по умолчанию.


Лучше всего вообще забыть о синтаксическом анализе вывода Unison и вместо этого использовать inotifywait . Вы можете настроить inotifywait , чтобы отслеживать определенный каталог и сообщать обо всех файлах, которые были изменены, перемещены, созданы и т. Д.

inotifywait --event modify,attrib,move,create,delete  \
            --daemon                                  \
            --outfile /path/to/output.log             \
            --recursive                               \
            --quiet                                   \
            --format %w%f                             \
            '/watch/directory/'                   

Это запустит inotifywait как демон и выдаст очень хорошо, постоянно обновляемый список ( output.log ) абсолютных путей всех файлов в / watch / directory / , в которых произошло одно из указанных событий. Возможно, вам потребуется изменить данные события и / или использовать опцию - exclude , чтобы получить именно список файлов, которые вы хотите синхронизировать с S3.

2
ответ дан 3 December 2019 в 21:36