rsync: Linux में फ़ाइलें सिंक और बैकअप करने के उदाहरण
rsync फ़ाइलों को लोकल और SSH के ज़रिए सिंक करता है और केवल बदलाव भेजता है। बुनियादी कमांड है rsync -avz स्रोत/ user@host:/पथ/: -a अनुमतियाँ और समय सुरक्षित रखता है, -v फ़ाइलें दिखाता है, -z ट्रैफ़िक को कंप्रेस करता है; --delete गंतव्य को स्रोत की सटीक प्रति बनाता है, और -n से पहले बिना बदलाव के नतीजा देखा जा सकता है।
rsync Linux का मानक टूल है फ़ाइलें कॉपी और सिंक करने के लिए: लोकल पर, डिस्क के बीच और SSH से दो सर्वरों के बीच। cp और scp से इसका मुख्य फ़र्क यह है कि यह केवल बदली हुई चीज़ें भेजता है, इसलिए बड़ी डायरेक्टरी को दोबारा सिंक करने में कुछ ही सेकंड लगते हैं। नीचे rsync के उदाहरण हैं: प्रोजेक्ट को सर्वर पर भेजना, डायरेक्टरी का मिरर, बहिष्करण, स्नैपशॉट वाले बैकअप और cron से शेड्यूल।
सिंटैक्स और सबसे ज़रूरी फ़्लैग
कमांड का सामान्य रूप:
rsync [विकल्प] स्रोत... गंतव्य
स्रोत और गंतव्य लोकल पथ हो सकते हैं या user@host:/पथ के रूप में रिमोट। दोनों में से एक तरफ़ लोकल होना ज़रूरी है: rsync दो रिमोट मशीनों के बीच सीधे कॉपी नहीं करता।
| फ़्लैग | क्या करता है |
|---|---|
-a | आर्काइव मोड: रिकर्सिव, अनुमतियाँ, मालिक, ग्रुप, संशोधन समय और सिम्बॉलिक लिंक सुरक्षित रखता है (यह -rlptgoD के बराबर है) |
-v | भेजी जा रही फ़ाइलों की सूची दिखाना |
-z | नेटवर्क पर डेटा कंप्रेस करना |
-h | आकार पढ़ने में आसान रूप में (K, M, G) |
-P | --partial --progress के बराबर: प्रगति और अधूरी फ़ाइलों को आगे से जारी करना |
-n, --dry-run | ड्राई रन: बिना कुछ बदले बताना कि क्या होगा |
--delete | गंतव्य से वे फ़ाइलें हटाना जो स्रोत में नहीं हैं |
--exclude | पैटर्न से मेल खाने वाली फ़ाइलें कॉपी न करना |
-e | रिमोट शेल तय करना, जैसे -e "ssh -p 2222" |
-H, -A, -X | हार्ड लिंक, ACL और विस्तारित एट्रिब्यूट सुरक्षित रखना (ये -a में शामिल नहीं हैं) |
व्यवहार में दस में से नौ मामलों में लोकल के लिए rsync -avh और नेटवर्क के लिए rsync -avzh काफ़ी है।
पथ के अंत में slash: सबसे बड़ा जाल
नए उपयोगकर्ताओं की सबसे आम गलती स्रोत के अंत में लगे slash से जुड़ी है। इसी से तय होता है कि कॉपी डायरेक्टरी खुद होगी या सिर्फ़ उसकी सामग्री।
# डायरेक्टरी project को /backup के अंदर कॉपी करें → /backup/project/... बनेगा
rsync -av project /backup/
# project की सामग्री को /backup में कॉपी करें → फ़ाइलें सीधे /backup/ में होंगी
rsync -av project/ /backup/
याद रखने का आसान तरीका: स्रोत के अंत का slash मतलब है «इस डायरेक्टरी की सामग्री»। गंतव्य पर slash का कोई असर नहीं होता। शक हो तो -n जोड़कर देखें कि rsync कौन-से पथ बनाने वाला है।
लोकल कॉपी
प्रगति दिखाते हुए डायरेक्टरी को बाहरी डिस्क पर कॉपी करना:
rsync -avhP ~/photos/ /mnt/usb/photos/
वही कमांड दोबारा चलाने पर सब कुछ फिर से कॉपी नहीं होता: rsync फ़ाइलों का आकार और संशोधन समय मिलाता है और केवल नई या बदली हुई फ़ाइलें भेजता है। आख़िर में दिखता है कि वास्तव में कितना डेटा गया:
sending incremental file list
2026/10/IMG_2041.jpg
4.12M 100% 38.40MB/s 0:00:00 (xfr#1, to-chk=0/1534)
sent 4.13M bytes received 9.25K bytes 2.76M bytes/sec
total size is 6.82G speedup is 1,648.21
speedup मान बताता है कि पूरी कॉपी की तुलना में कितनी गुना कम डेटा भेजा गया।
SSH से rsync: सर्वर पर कॉपी और वापस लाना
रिमोट पथों के लिए rsync डिफ़ॉल्ट रूप से SSH इस्तेमाल करता है, इसलिए अलग से कुछ सेट करने की ज़रूरत नहीं — बस सामान्य ssh लॉगिन काम करना चाहिए। चाबियों (keys) के साथ यह सबसे सुविधाजनक है: पासवर्ड नहीं पूछा जाता और कमांड cron में डाली जा सकती है।
# साइट को सर्वर पर अपलोड करना
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/
# सर्वर से लॉग अपने कंप्यूटर पर लाना
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/
# गैर-मानक पोर्ट और खास key के साथ SSH
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/
rsync दोनों मशीनों पर इंस्टॉल होना चाहिए: रिमोट तरफ़ वह SSH से चलता है। अगर वह वहाँ नहीं है, तो आपको rsync: command not found दिखेगा — पैकेज इंस्टॉल करें (sudo apt install rsync या sudo dnf install rsync)।
अगर होस्ट ~/.ssh/config में किसी उपनाम (alias) से लिखा है, तो rsync उसे भी समझता है: rsync -avz ./site/ prod:/var/www/site/।
सर्वर पर root अधिकार चाहिए
अगर गंतव्य की फ़ाइलें root की हैं और आप साधारण उपयोगकर्ता के रूप में लॉगिन करते हैं, तो रिमोट rsync को sudo से चलाया जा सकता है:
rsync -avz --rsync-path="sudo rsync" ./conf/ admin@server:/etc/myapp/
इसके लिए सर्वर पर rsync के लिए sudo बिना पासवर्ड के चलना चाहिए (sudoers में नियम)। वरना कमांड इनपुट का इंतज़ार करते हुए अटक जाएगी।
डायरेक्टरी का मिरर: --delete
डिफ़ॉल्ट रूप से rsync केवल फ़ाइलें जोड़ता और अपडेट करता है, कुछ हटाता नहीं। गंतव्य को स्रोत की सटीक प्रति बनाने के लिए --delete चाहिए:
rsync -avh --delete ~/projects/ /mnt/backup/projects/
यह शक्तिशाली और खतरनाक फ़्लैग है। पथ में गलती (जैसे खाली स्रोत या भूला हुआ slash) गंतव्य का डेटा मिटा सकती है। इसलिए नियम एक है: --delete वाली हर कमांड पहले -n के साथ चलाएँ।
$ rsync -avhn --delete ~/projects/ /mnt/backup/projects/
sending incremental file list
deleting old-app/README.md
deleting old-app/
app/main.py
sent 1.20K bytes received 64 bytes 2.53K bytes/sec
total size is 18.4M speedup is 14,554.39 (DRY RUN)
deleting वाली पंक्तियाँ बताती हैं कि क्या मिटेगा। जब सब सही लगे, तब -n हटाकर चलाएँ।
कुछ उपयोगी रूप: --delete-after फ़ाइलें भेजने के बाद हटाता है (गंतव्य लंबे समय तक पूरा रहता है), और --backup --backup-dir=/mnt/backup/deleted-$(date +%F) फ़ाइलें नहीं मिटाता, बल्कि हटाई या बदली गई फ़ाइलों को अलग डायरेक्टरी में ले जाता है।
बहिष्करण: --exclude और --include
डिप्लॉय और बैकअप में अस्थायी फ़ाइलें, डिपेंडेंसी और सीक्रेट बाहर रखना आम बात है।
# कई पैटर्न
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/
# पैटर्न एक फ़ाइल से
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/
.rsyncignore फ़ाइल पैटर्न की सादी सूची है, हर पंक्ति में एक:
.git/
node_modules/
*.log
.env
tmp/
पैटर्न कैसे काम करते हैं:
- शुरुआत में slash के बिना पैटर्न (
*.log) किसी भी गहराई पर मेल खाता है। - शुरुआत में slash वाला पैटर्न (
/tmp/) स्थानांतरण की जड़ से बँधा है — यह केवल सबसे ऊपर वालीtmpको बाहर करेगा। - अंत में slash (
cache/) का मतलब है «केवल डायरेक्टरी»। - नियम क्रम से जाँचे जाते हैं, पहला मेल खाने वाला नियम लागू होता है।
आख़िरी बिंदु से «केवल ज़रूरी चीज़ें कॉपी करने» की तकनीक निकलती है: पहले ज़रूरी को अनुमति दें, फिर बाकी सब बंद करें।
# केवल .conf फ़ाइलें कॉपी करें, डायरेक्टरी संरचना सुरक्षित रखते हुए
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/
यहाँ --include='*/' ज़रूरी है, ताकि rsync सभी उप-डायरेक्टरी में जाए। खाली फ़ोल्डर बनने से रोकने के लिए --prune-empty-dirs (-m) जोड़ें।
rsync से बैकअप
सरल रोज़ाना कॉपी
होम डायरेक्टरी का न्यूनतम बैकअप दूसरी डिस्क पर:
rsync -aH --delete --exclude='.cache/' /home/alice/ /mnt/backup/alice/
इस तरीके की कमी यह है कि केवल एक संस्करण रहता है। अगर फ़ाइल बिगड़ गई और बैकअप उसी समय सिंक हो गया, तो पुराना संस्करण खो जाता है।
--link-dest से इंक्रिमेंटल स्नैपशॉट
फ़्लैग --link-dest इस समस्या को लगभग मुफ़्त में, उसी जगह पर हल करता है। जो फ़ाइलें नहीं बदलीं, उन्हें दोबारा कॉपी नहीं किया जाता, बल्कि पिछले स्नैपशॉट की फ़ाइलों के हार्ड लिंक बनाए जाते हैं। हर स्नैपशॉट पूरी कॉपी जैसा दिखता है, लेकिन जगह केवल बदलावों की लगती है।
#!/bin/bash
set -euo pipefail
SRC="/home/alice/"
DEST="/mnt/backup/snapshots"
TODAY="$(date +%F)"
mkdir -p "$DEST"
rsync -aH --delete \
--exclude='.cache/' \
--link-dest="$DEST/latest" \
"$SRC" "$DEST/$TODAY"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
पहली बार जब latest डायरेक्टरी मौजूद नहीं होती, rsync चेतावनी देगा और पूरी कॉपी बनाएगा — यह सामान्य है। पुराने स्नैपशॉट साधारण rm -rf से हटाए जाते हैं: जिन फ़ाइलों को दूसरे स्नैपशॉट इस्तेमाल करते हैं, वे इससे नहीं मिटतीं।
30 दिन से पुराने स्नैपशॉट ऐसे हटाए जा सकते हैं:
find /mnt/backup/snapshots -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +
सर्वर का बैकअप दूसरी मशीन पर
दिशा «बैकअप सर्वर से काम वाले सर्वर की ओर» चुनना सुविधाजनक है: बैकअप मशीन खुद डेटा खींचती है, और काम वाले सर्वर के पास बैकअप तक पहुँच नहीं होती। अगर उसे हैक कर लिया जाए, तो बैकअप सुरक्षित रहते हैं।
rsync -azH --delete -e "ssh -i /root/.ssh/backup_key" \
backup@web01:/var/www/ /srv/backups/web01/www/
ध्यान रखें कि डेटाबेस को इस तरह कॉपी नहीं किया जा सकता: चालू डेटाबेस की फ़ाइलें कॉपी के दौरान आपस में मेल नहीं खातीं। पहले डंप बनाएँ (mysqldump, pg_dump), और rsync से तैयार डंप फ़ाइल भेजें।
cron से शेड्यूल पर चलाना
बैकअप स्क्रिप्ट को crontab -e से cron में डाला जाता है:
# हर दिन 03:15 पर, आउटपुट लॉग में
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
cron से चलने वाला बैकअप सही काम करे, इसके लिए जाँचें:
- स्क्रिप्ट में पूरे (absolute) पथ इस्तेमाल हों: cron का
PATHन्यूनतम होता है और वर्तमान डायरेक्टरी अलग होती है। - SSH key बिना पासवर्ड के हो, और होस्ट पहले से
known_hostsमें हो — वरना rsync होस्ट की पहचान के सवाल पर अटक जाएगा। - स्क्रिप्ट रिटर्न कोड जाँचे: सफलता पर rsync 0 देता है, 23 — यदि कुछ फ़ाइलें नहीं भेजी जा सकीं, 24 — यदि कॉपी के दौरान फ़ाइलें गायब हो गईं।
- एक साथ दो कॉपी चलने से
flockबचाता है:flock -n /tmp/backup.lock /usr/local/bin/backup.sh।
cron की जगह systemd टाइमर भी इस्तेमाल किया जा सकता है — वह आउटपुट जर्नल में लिखता है, और नतीजे journalctl से देखना आसान है।
बड़े ट्रांसफ़र के लिए उपयोगी विकल्प
| काम | विकल्प |
|---|---|
| गति सीमित करना, ताकि चैनल पूरा न भर जाए | --bwlimit=5M |
| टूटने के बाद बड़ी फ़ाइल आगे से डाउनलोड करना | -P (या --partial) |
| फ़ाइलों की सूची की जगह कुल प्रगति | --info=progress2 |
| समय की जगह सामग्री (checksum) से तुलना | -c (--checksum), धीमा |
| गंतव्य की नई फ़ाइलों को न छूना | -u (--update) |
| मौजूदा फ़ाइलों को न बदलना | --ignore-existing |
| भेजने के बाद स्रोत फ़ाइलें हटाना (मूव) | --remove-source-files |
| अंत में विस्तृत आँकड़े | --stats |
आम गलतियाँ और उनका समाधान
- लिखते समय
Permission denied— उपयोगकर्ता के पास गंतव्य डायरेक्टरी पर अधिकार नहीं है। डायरेक्टरी का मालिक जाँचें या--rsync-path="sudo rsync"इस्तेमाल करें। - फ़ाइलें हर बार दोबारा कॉपी होती हैं — संशोधन समय सुरक्षित नहीं रहता। सुनिश्चित करें कि
-aया-tहै; FAT/exFAT पर--modify-window=2जोड़ें, क्योंकि ये सिस्टम समय दो सेकंड की सटीकता से रखते हैं। - फ़्लैश ड्राइव या नेटवर्क फ़ोल्डर पर
chownयाchgrpकी त्रुटि — फ़ाइल सिस्टम मालिकों को सपोर्ट नहीं करता।-aकी जगह-rltलिखें। - अनचाहा नेस्टिंग
/backup/project/project— स्रोत के अंत के slash में गलती। connection unexpectedly closed— SSH की समस्या, या रिमोट तरफ़ rsync इंस्टॉल नहीं है। सामान्यsshसे लॉगिन और सर्वर परrsyncकी मौजूदगी जाँचें।
निष्कर्ष
रोज़मर्रा के काम के लिए कुछ कमांड याद रखना काफ़ी है: SSH से कॉपी के लिए rsync -avz src/ host:/dst/, मिरर के लिए --delete के साथ पहले -n, फ़ालतू चीज़ों के लिए --exclude, और स्नैपशॉट वाले बैकअप के लिए --link-dest। स्रोत के अंत के slash पर ध्यान दें — तब rsync मशीनों के बीच फ़ाइलें ले जाने का सबसे भरोसेमंद तरीका बन जाता है। सिंक और बैकअप का व्यावहारिक अभ्यास Linux कोर्स में किया जाता है।
अक्सर पूछे जाने वाले प्रश्न
rsync, scp से बेहतर क्यों है?
scp हर बार फ़ाइलें पूरी कॉपी करता है, जबकि rsync केवल बदलाव भेजता है, आधी रह गई कॉपी आगे बढ़ा सकता है, गंतव्य का फ़ालतू डेटा हटा सकता है और पैटर्न से फ़ाइलें बाहर रख सकता है। एक फ़ाइल की एक बार की कॉपी में फ़र्क लगभग नहीं है, लेकिन नियमित सिंक में rsync कहीं तेज़ है।
क्या Windows पर rsync इस्तेमाल हो सकता है?
हाँ, WSL के ज़रिए, जहाँ rsync सामान्य Linux की तरह इंस्टॉल होता है, या Cygwin से। Windows मशीन की फ़ाइलें Linux सर्वर से सिंक करने के लिए WSL सबसे सुविधाजनक है।
क्या rsync डेटा को एन्क्रिप्ट करता है?
rsync खुद एन्क्रिप्ट नहीं करता, लेकिन SSH से कॉपी करते समय सारा ट्रैफ़िक एन्क्रिप्टेड SSH कनेक्शन से जाता है। बिना एन्क्रिप्शन के डेटा केवल rsync:// पते वाले rsync डेमन से भेजा जाता है।
कैसे जाँचें कि कॉपी मूल फ़ाइलों से मेल खाती है?
rsync -avnc स्रोत/ गंतव्य/ चलाएँ — -c फ़ाइलों को checksum से मिलाता है और -n कुछ नहीं बदलता। अगर सूची खाली है, तो कॉपियाँ एक जैसी हैं।
rsync बीच में रुक जाए तो क्या होगा?
जो फ़ाइलें पूरी भेज दी गईं, वे रहती हैं, और अधूरी फ़ाइल डिफ़ॉल्ट रूप से हटा दी जाती है। वही कमांड दोबारा चलाने पर काम वहीं से जारी होता है, और -P के साथ अधूरी फ़ाइल का हिस्सा भी बचा रहता है।
यह विषय “Linux: с нуля до уверенного администрирования” कोर्स में अभ्यास के साथ विस्तार से समझाया गया है।
कोर्स पर जाएँ