Поддерживайте удаленный каталог в актуальном состоянии - PullRequest
38 голосов
/ 13 августа 2008

Мне очень нравится функция Поддерживать актуальность удаленного каталога в Winscp . К сожалению, я не могу найти ничего более простого в использовании в OS X или Linux. Я знаю, что то же самое можно теоретически выполнить, используя changefiles или rsync , но я всегда находил учебники для обоих инструментов отсутствующими и / или противоречивыми ,

Мне просто нужен инструмент, который работает в OSX или Linux и поддерживает синхронизацию (зеркальное отображение) удаленного каталога с локальным каталогом, пока я вносю изменения в локальный каталог.


Обновление

Просматривая решения, я вижу пару, которая решает общую проблему синхронизации удаленного каталога с локальным каталогом вручную . Я знаю, что могу установить задачу cron для запуска rsync каждую минуту, и это должно быть довольно близко к реальному времени.

Это не точное решение, которое я искал, поскольку winscp делает это и многое другое: он обнаруживает изменения файлов в каталоге (пока я над ними работаю), а затем автоматически отправляет изменения на удаленный сервер. Я знаю, что это не лучшее решение (без репозитория кода), но оно позволяет мне очень быстро тестировать код на сервере во время его разработки. Кто-нибудь знает, как объединить rsync с любыми другими командами, чтобы получить эту функциональность?

Ответы [ 16 ]

40 голосов
/ 08 марта 2013

lsyncd кажется идеальным решением. он объединяет inotify (встроенная функция ядра, которая отслеживает изменения файлов в деревьях каталогов) и rsync (кроссплатформенный инструмент синхронизации файлов).

lsyncd -rsyncssh /home remotehost.org backup-home/

Цитата из github:

Lsyncd отслеживает интерфейс монитора событий деревьев локальных каталогов (inotify или fsevents). Он объединяет и объединяет события в течение нескольких секунд, а затем запускает один (или более) процесс (ы) для синхронизации изменений. По умолчанию это rsync. Таким образом, Lsyncd - это легкое решение для живого зеркала, которое сравнительно легко установить, не требующее новых файловых систем или блочных устройств, и не снижающее производительность локальной файловой системы.

17 голосов
/ 13 августа 2008

Как в режиме реального времени вы хотите синхронизацию? Я все еще склонялся бы к rsync, поскольку вы знаете, что он будет полностью поддерживаться на обеих платформах (Windows также с Cygwin), и вы можете запустить его с помощью задания cron. У меня есть очень простой bash-файл, который я запускаю в своей системе (это не удаляет старые файлы):

#!/bin/sh
rsync -avrz --progress --exclude-from .rsync_exclude_remote . remote_login@remote_computer:remote_dir    

# options
#   -a  archive
#   -v  verbose
#   -r  recursive
#   -z  compress 

Лучше всего настроить и попробовать. Опция -n (--dry-run) - ваш друг!

Имейте в виду, что rsync (по крайней мере, в cygwin) не поддерживает имена файлов в кодировке Unicode (по состоянию на 16 августа 2008 г.).

8 голосов
/ 14 ноября 2008

Что вы хотите сделать для удаленного доступа linux, так это использовать sshfs - файловую систему SSH.

# sshfs username@host:path/to/directory local_dir

Тогда относитесь к нему как к сетевому монтированию, которым оно является ...

Немного подробнее, например, как настроить его, чтобы вы могли сделать это как обычный пользователь, на моем блоге

Если вы хотите асинхронное поведение winSCP, вам нужно использовать rsync в сочетании с чем-то, что периодически выполняет его. Решение cron выше работает, но может быть излишним для варианта использования winscp.

Следующая команда будет выполнять rsync каждые 5 секунд для передачи содержимого на удаленный хост. При необходимости вы можете настроить время ожидания, чтобы уменьшить нагрузку на сервер.

# while true; do rsync -avrz localdir user@host:path; sleep 5; done

Если у вас очень большая структура каталогов и вам нужно уменьшить накладные расходы при опросе, вы можете использовать 'find':

# touch -d 01/01/1970 last; while true; do if [ "`find localdir -newer last -print -quit`" ]; then touch last; rsync -avrz localdir user@host:path; else echo -ne .; fi; sleep 5; done

И я сказал, что cron может быть излишним? Но, по крайней мере, все это делается только из командной строки и может быть остановлено с помощью ctrl-C.

кб

4 голосов
/ 13 августа 2008

Чтобы обнаружить измененные файлы, вы можете попробовать fam (монитор изменений файлов) или inotify. Последний специфичен для Linux, у fam есть порт bsd, который может работать в OS X. Оба имеют инструменты пользовательского пространства, которые могут использоваться в скрипте вместе с rsync.

3 голосов
/ 07 декабря 2010

У меня та же проблема. Мне понравилась команда winscp "держать удаленный каталог в актуальном состоянии". Однако в своем стремлении избавиться от Windows я потерял winscp. Я написал сценарий, который использует файловый обмен и rsync, чтобы сделать что-то похожее гораздо ближе к реальному времени.

Как использовать:

  • Убедитесь, что у вас установлены файлы с заменой
  • Сохраните этот сценарий в / usr / local / bin / LifeSync или в другом месте в вашем $ PATH и сделайте его исполняемым
  • Используйте Nautilus для подключения к удаленному хосту (sftp или ftp)
  • Запустите этот скрипт, выполнив liveync SOURCE DEST
  • Каталог DEST будет находиться в /home/[username]/.gvfs/[path для ftp scp или чего-либо другого]

Пара минусов:

  • Это медленнее, чем winscp (я думаю, потому что он проходит через Наутилус и должен также обнаруживать изменения через rsync)
  • Вы должны вручную создать каталог назначения, если он еще не существует. Поэтому, если вы добавляете каталог, он не обнаружит и не создаст каталог на стороне DEST.
  • Вероятно, больше, что я еще не заметил
  • Кроме того, не пытайтесь синхронизировать каталог SRC с именем «rsyncThis». Это, вероятно, не будет хорошо :) 1028

#!/bin/sh

upload_files()
{
    if [ "$HOMEDIR" = "." ]
    then
        HOMEDIR=`pwd`
    fi

    while read  input
    do
        SYNCFILE=${input#$HOMEDIR}
        echo -n "Sync File: $SYNCFILE..."
        rsync -Cvz --temp-dir="$REMOTEDIR" "$HOMEDIR/$SYNCFILE" "$REMOTEDIR/$SYNCFILE" > /dev/null
        echo "Done."
    done
}


help()
{
    echo "Live rsync copy from one directory to another.  This will overwrite the existing files on DEST."
    echo "Usage: $0 SOURCE DEST"    
}


case "$1" in
  rsyncThis)
    HOMEDIR=$2
    REMOTEDIR=$3
    echo "HOMEDIR=$HOMEDIR"
    echo "REMOTEDIR=$REMOTEDIR"
    upload_files
    ;;

  help)
    help
    ;;

  *)
    if [ -n "$1" ] && [ -n "$2" ]
    then
        fileschanged -r "$1" | "$0" rsyncThis "$1" "$2"
    else
        help
    fi
    ;;
esac
2 голосов
/ 13 августа 2008

Решения rsync действительно хороши, особенно если вы продвигаете изменения только в одном направлении. Еще один замечательный инструмент - unison - он пытается синхронизировать изменения в обоих направлениях. Подробнее на домашней странице Unison .

2 голосов
/ 13 августа 2008

Вы всегда можете использовать управление версиями, например SVN, поэтому все, что вам нужно сделать, это заставить сервер запускать svn для папки каждую ночь. Это приводит к проблемам безопасности, если вы публикуете свои файлы публично, но это работает.

Если вы используете Linux, научитесь использовать rsync. Это действительно не так сложно, так как вы можете проверить каждую команду с помощью -n. Перейдите по справочной странице , базовый формат, который вам нужен -

rsync [ОПЦИЯ ...] SRC ... [ПОЛЬЗОВАТЕЛЬ @] ВЕДУЩАЯ: DEST

команда, которую я запускаю со своего школьного сервера на домашнюю резервную машину, это

rsync -avi --delete ~ me @ homeserv: ~ / School / >> BackupLog.txt

Это берет все файлы в моем домашнем каталоге (~) и использует архивный режим rsync (-a), подробно (-v), перечисляет все сделанные изменения (-i), удаляя все файлы, которые не Он больше не существует (--delete) и помещает его в папку / home / me / School / на моем удаленном сервере. Вся распечатанная информация (что было скопировано, что было удалено и т. Д.) Также добавляется в файл BackupLog.txt

Я знаю, что это вихревой тур по rsync, но я надеюсь, что это поможет.

1 голос
/ 20 февраля 2015

Пользователь watcher.py и rsync для автоматизации этого. Прочитайте следующие пошаговые инструкции здесь:

http://kushellig.de/linux-file-auto-sync-directories/

1 голос
/ 13 января 2012

Раньше у меня были те же настройки под Windows, что и у вас, это локальное файловое дерево (версионное) и тестовая среда на удаленном сервере, которую я отражал в реальном времени с WinSCP. Когда я переключился на Mac, мне пришлось немного покопаться, прежде чем я был счастлив, но в итоге я использовал:

  • SmartSVN как мой клиент Subversion
  • Sublime Text 2 в качестве моего редактора (он уже использовался в Windows)
  • SFTP-плагин для ST2, который обрабатывает загрузку при сохранении (извините, не может опубликовать более 2 ссылок)

Я действительно могу порекомендовать эту настройку, надеюсь, она поможет!

1 голос
/ 22 сентября 2008

Будет DropBox (http://www.getdropbox.com/) делать то, что вы хотите?

...