質問

私は本当に大好きです リモートディレクトリを最新の状態に保つ の特徴 Winscp. 。残念ながら、OS X や Linux ではこれほど簡単に使えるものは見つかりません。私は同じことができることを知っています 理論的には を使用して達成される 変更されたファイル または rsync, しかし、私はいつも両方のツールのチュートリアルが不足していたり​​、矛盾していることに気づきました。

基本的に必要なのは、OSX または Linux で動作し、ローカル ディレクトリに変更を加えている間、リモート ディレクトリとローカル ディレクトリの同期 (ミラーリング) を維持するツールだけです。


アップデート

ソリューションを調べてみると、リモート ディレクトリとローカル ディレクトリの同期を維持するという一般的な問題を解決するものがいくつかあります。 手動で. 。rsync を毎分実行するように cron タスクを設定できることはわかっており、これはかなりリアルタイムに近いはずです。

これは、winscp がこれなどを行うため、私が探していた正確なソリューションではありません。ディレクトリ内のファイルの変更を (作業中に) 検出し、その変更をリモート サーバーに自動的にプッシュします。これが最良の解決策 (コード リポジトリがない) ではないことは承知していますが、開発中にサーバー上でコードを非常に迅速にテストできます。rsync と他のコマンドを組み合わせてこの機能を実現する方法を知っている人はいますか?

役に立ちましたか?

解決

同期をどのくらい「リアルタイム」にしたいですか?rsync は両方のプラットフォーム (Windows も cygwin で) で完全にサポートされ、cron ジョブ経由で実行できることがわかっているので、私は依然として rsync に傾きます。私のシステム上で実行する非常に単純な 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 ファイル名をサポートしていないことに注意してください (2008 年 8 月 16 日現在)。

他のヒント

lsyncd 完璧な解決策のようです。それは組み合わせる 通知する (ディレクトリツリー内のファイル変更を監視するカーネル組み込み関数) および rsync (クロスプラットフォームのファイル同期ツール)。

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

github からの引用:

Lsyncd は、ローカル ディレクトリ ツリー イベント モニター インターフェイス (inotify または fsevents) を監視します。数秒間のイベントを集約して結合し、変更を同期するために 1 つ (または複数) のプロセスを生成します。デフォルトでは、これは rsync です。したがって、Lsyncd は、新しいファイルシステムやブロックデバイスを必要とせず、インストールが比較的簡単で、ローカル ファイルシステムのパフォーマンスを妨げない軽量のライブ ミラー ソリューションです。

Linux リモート アクセスでやりたいことは、SSH ファイル システムである「sshfs」を使用することです。

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

次に、それをネットワークマウントのように扱います。

通常のユーザーとしてこれを実行できるように設定する方法など、もう少し詳しく説明します。 私のブログ

winSCP の非同期動作が必要な場合は、rsync を定期的に実行するものと組み合わせて使用​​するとよいでしょう。上記の cron ソリューションは機能しますが、winscp の使用例には過剰になる可能性があります。

次のコマンドは、5 秒ごとに rsync を実行して、コンテンツをリモート ホストにプッシュします。必要に応じてスリープ時間を調整して、サーバーの負荷を軽減できます。

# 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 で停止できます。

KB

変更されたファイルを検出するには、fam (ファイル変更モニター) または inotify を試すことができます。後者は Linux 固有であり、fam には OS X で動作する可能性のある bsd ポートがあります。どちらにも、rsync とともにスクリプトで使用できるユーザー空間ツールがあります。

私も同じ問題を抱えています。私はwinscpの「リモートディレクトリを最新の状態に保つ」コマンドが大好きでした。しかし、Windows を削除しようとしているうちに、winscp を失ってしまいました。私は、fileschanged と rsync を使用して、リアルタイムに近い同様の処理を行うスクリプトを作成しました。

使い方:

  • fileschanged がインストールされていることを確認してください
  • このスクリプトを /usr/local/bin/livesync または $PATH で到達可能な場所に保存し、実行可能にします。
  • Nautilus を使用してリモート ホスト (sftp または ftp) に接続します。
  • livesync を実行してこのスクリプトを実行します ソース宛先
  • DEST ディレクトリは /home/[ユーザー名]/.gvfs/[ftp scp へのパスなど] にあります。

いくつかの欠点:

  • winscp よりも遅いです (私の推測では、Nautilus を経由し、rsync を通じて変更を検出する必要があるためだと思います)
  • 宛先ディレクトリがまだ存在しない場合は、手動で作成する必要があります。したがって、ディレクトリを追加する場合、DEST 側ではディレクトリが検出されず、作成されません。
  • おそらく私がまだ気づいていないことの方が多いでしょう
  • また、「rsyncThis」という名前の SRC ディレクトリを同期しようとしないでください。それはおそらく良くないでしょう:)

#!/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

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 の目まぐるしいツアーであることは承知していますが、お役に立てれば幸いです。

rsync 特に変更を一方向にのみプッシュする場合には、ソリューションは非常に優れています。もう一つの優れたツールは、 unison -- 両方向で変更を同期しようとします。続きを読む ユニゾンのホームページはこちら.

おそらく間違った問題を解決しているようです。リモート コンピュータ上のファイルを編集しようとしている場合は、jedit の ftp プラグインなどを使用してみてください。 http://plugins.jedit.org/plugins/?FTP これにより、ファイルのバージョンが 1 つだけになるため、同期が失われることがなくなります。

icco の SVN の提案に基づいて、ソース管理に Subversion などを使用している場合 (使用していない場合は、おそらく使い始めるべきです)、次のコマンドを入力することで運用環境を最新の状態に保つことができることを実際に提案します。リポジトリをコミット後のフックに更新します。

それをどのように行うかには多くの変数がありますが、私がうまくいったのは、開発サイトまたはライブサイトを作業コピーにし、ポストコミットで強制コマンドで ssh キーを使用することです。リモート サイトにログインし、作業コピー上で SVN アップをトリガーします。あるいは、コミット後のフックで、リモート マシン上で svn エクスポートをトリガーするか、ローカル (svn リポジトリへ) svn エクスポートをトリガーしてから、リモート マシンへの rsync をトリガーすることもできます。

変更を検出してプッシュするものについては心配でしたし、競合状態のために毎分実行されるものについても心配していました。ファイルが書き込まれるのと同じ瞬間にファイルが転送されないことは、どうやってわかるのでしょうか?1 回か 2 回そのようなことに遭遇すると、常に rsync などを実行することで得ていた時間節約の利点がすべて失われます。

ウィルドロップボックス (http://www.getdropbox.com/)やりたいことをやりますか?

これを自動化するには、watcher.py と rsync を使用します。ここで次のステップバイステップの手順をお読みください。

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

私は Windows であなたと同じセットアップをしていました。つまり、ローカル ファイルツリー (バージョン管理) とリモート サーバー上のテスト環境であり、WinSCP でリアルタイムにミラーリングし続けていました。Mac に切り替えたとき、満足するまでにかなりの作業を行う必要がありましたが、最終的には次のものを使用するようになりました。

  • スマートS​​VN 私の転覆クライアントとして
  • 崇高なテキスト 2 私のエディターとして (すでに Windows で使用しています)
  • 保存時にアップロードを処理する ST2 への SFTP プラグイン (申し訳ありませんが、2 つ以上のリンクを投稿できません)

このセットアップは本当にお勧めできます。お役に立てば幸いです。

Fetch を SFTP クライアントとして使用し、その中からサーバー上のファイルを直接編集することもできます。SSHFS (ssh フォルダーをボリュームとしてマウント) オプションもあります。これは stimms が言ったことと一致しています。本当に同期を維持したいですか、それともサーバー上のファイルを編集したいだけですか?

OS X には独自のファイル通知システムがあり、これが Spotlight のベースになっています。これを使用して同期を維持するプログラムについては聞いたことがありませんが、確かに考えられます。

私は個人的にこの種の用途に RCS を使用しています。 - RCS には手動の側面がありますが、最初にテストせずに開発マシンからテスト サーバーに何かをプッシュすることは考えにくいです。開発サーバーで作業している場合は、上記のオプションのいずれかを使用します。

まあ、私も同じ種類の問題を抱えていたので、これらを一緒に使用することが可能です:rsync、SSH パスワードレス ログイン、Watchdog (Python 同期ユーティリティ)、および Terminal Notifier (Ruby で作成された OS X 通知ユーティリティ)。必要ありませんが、同期がいつ完了したかを知るのに役立ちます)。

  1. Dreamhost wiki のこのチュートリアルを使用して、パスワードレス ログインのキーを作成しました。 http://cl.ly/MIw5

    1.1.完了したら、すべてが正常かどうかをテストします。パスワードなしでログインできない場合は、afp マウントを試す必要があるかもしれません。Dreamhost (私のサイトがある場所) では afp マウントは許可されていませんが、パスワードなしのログインは許可されています。ターミナルで、次のように入力します。

    ssh username@host.com パスワードを尋ねられずにログインする必要があります:P

  2. Github ページから Terminal Notifier をインストールしました。 http://cl.ly/MJ5x

    2.1.Gem インストーラー コマンドを使用しました。ターミナルで、次のように入力します。

    gem install terminal-notifier

    2.3.通知が機能するかどうかをテストします。ターミナルで次のように入力します。

    terminal-notifier -message "Starting sync"

  3. rsync + 通知をテストする sh スクリプトを作成します。好きな場所に好きな名前をつけて保存します。この例では、次のように呼びます ~/スクリプト/sync.sh 「.sh」拡張子を使用しましたが、それが必要かどうかはわかりません。

    #!/bin/bash terminal-notifier -message "Starting sync" rsync -azP ~/Sites/folder/ user@host.com:site_folder/ terminal-notifier -message "Sync has finished"

    3.1.この sh スクリプトには必ず実行許可を与えてください。ターミナルで、次のように入力します。

    sudo chmod 777 ~/Scripts/sync.sh 3.2.スクリプトを実行し、メッセージが正しく表示されるか、rsync が実際にローカル フォルダーとリモート フォルダーを同期するかどうかを確認します。

  4. 最後に、Github ページから Watchdog をダウンロードしてインストールしました。 http://cl.ly/MJfb

    4.1.まず、Brew を使用して libyaml 依存関係をインストールしました (Brew のインストール方法には、OS X の「aptitude」のようなヘルプがたくさんあります)。ターミナルで、次のように入力します。

    brew install libyaml

    4.2.そこで「easy_installコマンド」を使用しました。Watchdog のフォルダーに移動し、ターミナルに次のように入力します。

    easy_install watchdog

  5. これで、すべてがインストールされました。 同期したいフォルダーに移動します, このコードを必要に応じて変更します, をクリックし、「ターミナル」と入力します。

      watchmedo shell-command
          --patterns="*.php;*.txt;*.js;*.css" \
          --recursive \
          --command='~/Scripts/Sync.sh' \
          .
    

    そうでなければなりません その通り この方法ではスラッシュと改行が含まれるため、これらの行をテキスト エディタにコピーし、スクリプトを変更し、ターミナルに貼り付けて Return キーを押す必要があります。

    改行なしで試してみましたが、うまくいきません。

    私の Mac では常にエラーが発生しますが、何も影響はないようです。

    /Library/Python/2.7/site-packages/argh-0.22.0-py2.7.egg/argh/completion.py:84: UserWarning: Bash completion not available. Install argcomplete.

    次に、フォルダー内のファイルにいくつかの変更を加えて、その魔法を見てみましょう。

私はこの小さな Ruby スクリプトを使用しています。

#!/usr/bin/env ruby
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Rsyncs 2Folders
#
# watchAndSync by Mike Mitterer, 2014 <http://www.MikeMitterer.at>
# with credit to Brett Terpstra <http://brettterpstra.com>
# and Carlo Zottmann <https://github.com/carlo/haml-sass-file-watcher>
# Found link on: http://brettterpstra.com/2011/03/07/watch-for-file-changes-and-refresh-your-browser-automatically/
#

trap("SIGINT") { exit }

if ARGV.length < 2
  puts "Usage: #{$0} watch_folder sync_folder"
  puts "Example: #{$0} web keepInSync"
  exit
end

dev_extension = 'dev'
filetypes = ['css','html','htm','less','js', 'dart']

watch_folder = ARGV[0]
sync_folder = ARGV[1]

puts "Watching #{watch_folder} and subfolders for changes in project files..."
puts "Syncing with #{sync_folder}..."

while true do
  files = []
  filetypes.each {|type|
    files += Dir.glob( File.join( watch_folder, "**", "*.#{type}" ) )
  }
  new_hash = files.collect {|f| [ f, File.stat(f).mtime.to_i ] }
  hash ||= new_hash
  diff_hash = new_hash - hash

  unless diff_hash.empty?
    hash = new_hash

    diff_hash.each do |df|
      puts "Detected change in #{df[0]}, syncing..."
      system("rsync -avzh #{watch_folder} #{sync_folder}")
    end
  end

  sleep 1
end

ニーズに合わせて調整してください!

リモート サーバー上で Python を開発している場合は、Pycharm が良い選択になるかもしれません。pycharm のリモート開発機能を利用して、リモート ファイルをローカル ファイルと同期できます。ガイドリンクは次のとおりです。https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top