আরএসওয়াইএনসি : rsync
কোনও হোম নেটওয়ার্কের মাধ্যমে বা ssh
দূরবর্তী সার্ভারের মাধ্যমে নির্বাচিত ফোল্ডার / ফাইলগুলি সিঙ্ক্রোনাইজ করুন ।
rsync
টার্গেটে থাকা ফাইলগুলি মুছতে সক্ষম এমন একতরফা সিঙ্ক্রোনাইজেশন ইউটিলিটি , সুতরাং দয়া করে সত্য এবং কাজটি করার আগে , উত্স এবং লক্ষ্য উভয় জায়গাতেই আপনার ডেটা ব্যাক-আপ করার বিষয়ে নিশ্চিত হন এবং--dry-run
বিকল্পটি ব্যবহার করে ভালভাবে পরীক্ষা করুন ।
.authinfo
ফাইলটি কীভাবে সঠিকভাবে কনফিগার করতে হয় সে সম্পর্কে পড়তে https://www.gnu.org/software/emacs/manual/auth.html দেখুন .authinfo
ফাইলের একটি উদাহরণ (যাতে একাধিক পৃথক এন্ট্রি থাকতে পারে) নিম্নরূপ:
machine mymachine login myloginname password mypassword port myport
দূরবর্তী সার্ভারে rsync-remote
সিঙ্ক্রোনাইজ করতে ফাংশনটি কনফিগার করুন এবং ব্যবহার করুন ssh
। অথবা, rsync-local
একই কম্পিউটারে বা কোনও বিশ্বস্ত হোম নেটওয়ার্কের মাধ্যমে সিঙ্ক্রোনাইজ করতে ফাংশনটি ব্যবহার করুন ।
(require 'auth-source)
;;; EXAMPLE:
;;; (get-auth-info "12.34.567.89" "username")
;;; (get-auth-info "localhost" "root")
(defun get-auth-info (host user &optional port)
(let ((info (nth 0 (auth-source-search
:host host
:user user
:port port
:require '(:user :secret)
:create t))))
(if info
(let* ((port (plist-get info :port))
(secret-maybe (plist-get info :secret))
(secret
(if (functionp secret-maybe)
(funcall secret-maybe)
secret-maybe)))
(list port secret))
nil)))
(defun rsync-filter (proc string)
(cond
((string-match
"^\\([a-zA-Z0-9_\\-\\.]+\\)@\\([a-zA-Z0-9_\\-\\.]+\\)'s password: "
string)
(let* ((user (substring string (match-beginning 1) (match-end 1)))
(host (substring string (match-beginning 2) (match-end 2)))
(password (car (cdr (get-auth-info host user)))))
(process-send-string proc (concat password "\n"))))
((not (or (string-match "files\\.\\.\\.\r" string)
(string-match "files to consider\n" string)))
(with-current-buffer (messages-buffer)
(let ((inhibit-read-only t))
(goto-char (point-max))
(when (not (bolp))
(insert "\n"))
(insert string)
(when (not (bolp))
(insert "\n")))))))
(defun rsync-remote ()
"Use rsync to a remote server via ssh. Back-up your data first!!!"
(interactive)
(let* (
(host "localhost")
(username "root")
(port (or (car (get-auth-info host username))
(number-to-string (read-number "Port: "))))
(source
(let ((dir (expand-file-name (locate-user-emacs-file "elpa/"))))
(if (file-directory-p dir)
dir
(let ((debug-on-quit nil)
(msg (format "`%s` is not a valid directory." dir)))
(signal 'quit `(,msg))))))
(target "/private/var/mobile/elpa/")
(ssh "/usr/bin/ssh")
(rsync "/usr/bin/rsync")
(rsync-include-file "/path/to/include-file.txt")
(rsync-exclude-file "/path/to/exclude-file.txt")
(rsh (concat "--rsh=ssh -p " port " -l " username))
(host+target (concat host ":" target)))
(start-process
"rsync-process"
nil
rsync
"-avr" ;; must specify the `-r` argument when using `--files-from`
"--delete"
;; The paths inside the exclusion file must be relative, NOT absolute.
;;; (concat "--files-from=" rsync-include-file)
;;; (concat "--exclude-from=" rsync-exclude-file)
rsh
source
host+target)
(set-process-filter (get-process "rsync-process") 'rsync-filter)
(set-process-sentinel
(get-process "rsync-process")
(lambda (p e) (when (= 0 (process-exit-status p))
(message "rsync-remote: synchronizing ... done."))))))
(defun rsync-local ()
"Use rsync locally -- e.g., over a trusted home network.
Back-up your data first!!!"
(interactive)
(let (
(rsync-program "/usr/bin/rsync")
(source
(let ((dir (expand-file-name
(file-name-as-directory
(read-directory-name "Source Directory: " nil nil nil nil)))))
(if (file-directory-p dir)
dir
(let ((debug-on-quit nil)
(msg (format "`%s` is not a valid directory." dir)))
(signal 'quit `(,msg))))))
(target (expand-file-name
(file-name-as-directory
(read-directory-name "Target Directory: " nil nil nil nil)))))
(unless (y-or-n-p (format "SOURCE: %s | TARGET: %s" source target))
(let ((debug-on-quit nil))
(signal 'quit `("You have exited the function."))))
(start-process "rsync-process"
nil
rsync-program
"--delete"
"-arzhv"
source
target)
(set-process-filter (get-process "rsync-process") #'rsync-process-filter)
(set-process-sentinel
(get-process "rsync-process")
(lambda (p e)
(when (= 0 (process-exit-status p))
(message "Done!"))))))