سؤال

أنا أحب بالتأكيد حافظ على تحديث الدليل البعيد ميزة في Winscp.لسوء الحظ، لا يمكنني العثور على أي شيء سهل الاستخدام في نظام التشغيل OS X أو Linux.وأنا أعلم أن نفس الشيء يمكن نظريا يتم إنجازه باستخدام تم تغيير الملفات أو rsync, ، لكنني وجدت دائمًا أن البرامج التعليمية لكلا الأداتين غير موجودة و/أو متناقضة.

أحتاج فقط إلى أداة تعمل في OSX أو Linux وتحتفظ بدليل بعيد متزامنًا (معكوسًا) مع دليل محلي أثناء إجراء تغييرات على الدليل المحلي.


تحديث

من خلال البحث في الحلول، أرى زوجين يحلان المشكلة العامة المتمثلة في الاحتفاظ بدليل بعيد متزامنًا مع دليل محلي يدويا.أعلم أنه يمكنني تعيين مهمة cron لتشغيل rsync كل دقيقة، ويجب أن يكون هذا قريبًا إلى حد ما من الوقت الفعلي.

ليس هذا هو الحل الدقيق الذي كنت أبحث عنه حيث يقوم برنامج WinSCP بذلك وأكثر:يكتشف تغييرات الملفات في الدليل (أثناء العمل عليها) ثم يدفع التغييرات تلقائيًا إلى الخادم البعيد.أعلم أن هذا ليس الحل الأفضل (لا يوجد مستودع تعليمات برمجية)، ولكنه يسمح لي باختبار التعليمات البرمجية بسرعة كبيرة على الخادم أثناء تطويرها.هل يعرف أحد كيفية دمج rsync مع أي أوامر أخرى للحصول على هذه الوظيفة؟

هل كانت مفيدة؟

المحلول

كيف "في الوقت الحقيقي" هل تريد المزامنة؟ما زلت أميل نحو 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).

نصائح أخرى

lsyncd يبدو أن الحل الأمثل.فهو يجمع بين com.inotify (وظيفة kernel المضمنة التي تراقب تغييرات الملفات في أشجار الدليل) و rsync (أداة مزامنة الملفات عبر النظام الأساسي).

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

اقتباس من جيثب:

يراقب Lsyncd واجهة مراقبة أحداث أشجار الدليل المحلي (inotify أو fsevents).يقوم بتجميع الأحداث ودمجها لبضع ثوان ثم ينتج عملية (عمليات) واحدة (أو أكثر) لمزامنة التغييرات.بشكل افتراضي، هذا هو rsync.وبالتالي فإن Lsyncd هو حل مرآة حية خفيف الوزن وسهل التثبيت نسبيًا ولا يتطلب أنظمة ملفات جديدة أو أجهزة حظر ولا يعيق أداء نظام الملفات المحلي.

ما تريد القيام به للوصول عن بعد لنظام التشغيل 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

وقلت أن كرون قد يكون مبالغة؟ولكن على الأقل يتم كل هذا من سطر الأوامر، ويمكن إيقافه عبر ctrl-C.

كيلو بايت

لاكتشاف الملفات التي تم تغييرها، يمكنك تجربة fam (مراقبة تغيير الملفات) أو inotify.هذا الأخير خاص بنظام التشغيل Linux، ويحتوي fam على منفذ bsd والذي قد يعمل على نظام التشغيل OS X.يحتوي كلاهما على أدوات مساحة المستخدم التي يمكن استخدامها في البرنامج النصي مع rsync.

لدي نفس المشكلة.لقد أحببت أمر WinSCP "الحفاظ على الدليل البعيد محدثًا".ومع ذلك، في سعيي لتخليص نفسي من نظام التشغيل Windows، فقدت ملف WinSCP.لقد قمت بكتابة برنامج نصي يستخدم fileschanged وrsync للقيام بشيء مماثل أقرب بكثير إلى الوقت الحقيقي.

كيف تستعمل:

  • تأكد من تثبيت الملفات التي تم تغييرها
  • احفظ هذا البرنامج النصي في /usr/local/bin/livesync أو في مكان يمكن الوصول إليه في $PATH الخاص بك واجعله قابلاً للتنفيذ
  • استخدم Nautilus للاتصال بالمضيف البعيد (sftp أو ftp)
  • قم بتشغيل هذا البرنامج النصي عن طريق إجراء lifesync وجهة المصدر
  • سيكون دليل DEST موجودًا في /home/[username]/.gvfs/[path to ftp scp أو أيًا كان]

سلبيات الزوجين:

  • إنه أبطأ من Winscp (أعتقد أنه يمر عبر Nautilus وعليه اكتشاف التغييرات من خلال rsync أيضًا)
  • يتعين عليك إنشاء الدليل الوجهة يدويًا إذا لم يكن موجودًا بالفعل.لذا، إذا كنت تضيف دليلاً، فلن يكتشف الدليل وينشئه على الجانب DEST.
  • وربما أكثر مما لم ألاحظه بعد
  • ولا تحاول أيضًا مزامنة دليل SRC المسمى "rsyncThis".ربما لن يكون ذلك جيدًا :)

#!/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 - يحاول مزامنة التغييرات في كلا الاتجاهين.اقرا المزيد من الصفحة الرئيسية للاتحاد.

يبدو أنك ربما تحل المشكلة الخاطئة.إذا كنت تحاول تحرير الملفات على جهاز كمبيوتر بعيد، فقد تحاول استخدام شيء مثل ملحق ftp الإضافي لـ jedit. http://plugins.jedit.org/plugins/?FTP يضمن هذا أن لديك نسخة واحدة فقط من الملف، لذا لا يمكن أن يكون غير متزامن على الإطلاق.

بناءً على اقتراح icco الخاص بـ SVN، أقترح في الواقع أنه إذا كنت تستخدم التخريب أو ما شابه ذلك للتحكم في المصدر (وإذا لم تكن كذلك، فمن المحتمل أن تبدأ) يمكنك تحديث بيئة الإنتاج عن طريق وضع الأمر لتحديث المستودع في ربط ما بعد الالتزام.

هناك الكثير من المتغيرات حول الطريقة التي تريد بها القيام بذلك، ولكن ما رأيته هو جعل موقع التطوير أو الموقع المباشر نسخة عمل ثم جعل مرحلة ما بعد الالتزام تستخدم مفتاح ssh مع أمر قسري للقيام بذلك قم بتسجيل الدخول إلى الموقع البعيد وقم بتشغيل svn على نسخة العمل.بدلاً من ذلك، في خطاف ما بعد الالتزام، يمكنك تشغيل تصدير svn على الجهاز البعيد، أو تصدير svn محلي (إلى مستودع svn) ثم rsync إلى الجهاز البعيد.

سأكون قلقًا بشأن الأشياء التي تكتشف التغييرات وتدفعها، وسأكون قلقًا أيضًا بشأن الأشياء التي تحدث كل دقيقة، فقط بسبب ظروف العرق.كيف تعرف أنه لن ينقل الملف في نفس اللحظة التي يتم كتابته فيها؟إذا تعثرت في ذلك مرة أو مرتين، فسوف تفقد كل ميزة توفير الوقت التي كانت تتمتع بها من خلال المزامنة المستمرة أو ما شابه ذلك.

سوف دروببوإكس (http://www.getdropbox.com/) افعل ما تريد؟

المستخدم watcher.py وrsync لأتمتة هذا.اقرأ التعليمات التالية خطوة بخطوة هنا:

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

اعتدت أن يكون لدي نفس الإعداد الذي لديك في نظام التشغيل Windows، وهو عبارة عن شجرة ملفات محلية (إصدار) وبيئة اختبار على خادم بعيد، والتي احتفظت بها معكوسة في الوقت الفعلي باستخدام WinSCP.عندما قمت بالتبديل إلى نظام التشغيل Mac، كان عليّ إجراء بعض البحث قبل أن أشعر بالسعادة، ولكن في النهاية انتهى بي الأمر باستخدام:

  • SmartSVN كعميل التخريب الخاص بي
  • النص السامي 2 كمحرر خاص بي (استخدمته بالفعل على نظام التشغيل Windows)
  • ملحق SFTP إلى ST2 الذي يتعامل مع التحميل عند الحفظ (عذرًا، لا يمكن نشر أكثر من رابطين)

يمكنني حقًا أن أوصي بهذا الإعداد، وآمل أن يساعد!

يمكنك أيضًا استخدام Fetch كعميل SFTP، ثم تحرير الملفات مباشرة على الخادم من داخل ذلك.هناك أيضًا خيارات SSHFS (تثبيت مجلد ssh كوحدة تخزين).يتماشى هذا مع ما قاله stimms - هل أنت متأكد من أنك تريد الاحتفاظ بالأشياء متزامنة، أم أنك تريد فقط تحرير الملفات على الخادم؟

يحتوي OS X على نظام إشعارات الملفات الخاص به - وهذا ما يستند إليه Spotlight.لم أسمع عن أي برنامج يستخدم هذا للحفاظ على مزامنة الأشياء، ولكن من المؤكد أنه يمكن تصوره.

أنا شخصيًا أستخدم RCS لهذا النوع من الأشياء: - على الرغم من أنه يحتوي على جانب يدوي، فمن غير المرجح أن أرغب في دفع شيء ما حتى إلى خادم الاختبار من جهاز التطوير الخاص بي دون اختباره أولاً.وإذا كنت أعمل على خادم تطوير، فأنا أستخدم أحد الخيارات المذكورة أعلاه.

حسنًا، لقد واجهت نفس المشكلة، ومن الممكن استخدام هذه العناصر معًا:rsync، وتسجيل الدخول بدون كلمة مرور SSH، وWatchdog (أداة مزامنة Python) وTerminal Notifier (أداة مساعدة لإشعارات OS X تم إنشاؤها باستخدام Ruby.ليست هناك حاجة إليها، ولكنها تساعد في معرفة وقت انتهاء المزامنة).

  1. لقد قمت بإنشاء مفتاح تسجيل الدخول بدون كلمة مرور باستخدام هذا البرنامج التعليمي من Dreamhost wiki: http://cl.ly/MIw5

    1.1.عند الانتهاء، اختبر ما إذا كان كل شيء على ما يرام... إذا لم تتمكن من تسجيل الدخول بدون كلمة مرور، فربما يتعين عليك تجربة تحميل AFP.لا يسمح Dreamhost (حيث يوجد موقعي) بتركيب AFP، ولكنه يسمح بتسجيل الدخول بدون كلمة مرور.في المحطة، اكتب:

    ssh username@host.com يجب عليك تسجيل الدخول دون أن يطلب منك كلمات المرور :P

  2. لقد قمت بتثبيت برنامج Terminal Notifier من صفحة Github: http://cl.ly/MJ5x

    2.1.لقد استخدمت أمر تثبيت Gem.في المحطة الطرفية، اكتب:

    gem install terminal-notifier

    2.3.اختبر ما إذا كان الإشعار يعمل أم لا. في الوحدة الطرفية، اكتب:

    terminal-notifier -message "Starting sync"

  3. قم بإنشاء برنامج نصي sh لاختبار إشعار rsync +.احفظه في أي مكان تريده وبالاسم الذي تريده.في هذا المثال، سأسميها ~/Scripts/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. أخيرًا، قمت بتنزيل Watchdog وتثبيته من صفحة Github: http://cl.ly/MJfb

    4.1.أولاً، قمت بتثبيت تبعية libyaml باستخدام Brew (هناك الكثير من المساعدة حول كيفية تثبيت Brew - مثل "aptitude" لنظام التشغيل OS X).في المحطة الطرفية، اكتب:

    brew install libyaml

    4.2.ثم استخدمت الأمر "easy_install".انتقل إلى مجلد Watchdog، واكتب في Terminal:

    easy_install watchdog

  5. الآن، تم تثبيت كل شيء! انتقل إلى المجلد الذي تريد مزامنته, تغيير هذا الرمز لاحتياجاتك, ، واكتب في المحطة الطرفية:

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

    يجب أن يكون بالضبط بهذه الطريقة، مع الخطوط المائلة وفواصل الأسطر، لذلك سيتعين عليك نسخ هذه السطور إلى محرر نصوص، وتغيير البرنامج النصي، ولصقها في الوحدة الطرفية والضغط على "رجوع".

    حاولت بدون فواصل الأسطر، ولم ينجح!

    في جهاز 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-Script الصغير هذا:

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

تكييفها لاحتياجاتك!

إذا كنت تقوم بتطوير لغة بايثون على خادم بعيد، فقد يكون Pycharm خيارًا جيدًا لك.يمكنك مزامنة ملفاتك البعيدة مع ملفاتك المحلية باستخدام ميزة التطوير عن بعد في pycharm.رابط الدليل كالتاليhttps://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top