ZIP को TAR में कैसे बदलें (लिनक्स सर्वर माइग्रेशन)
ZIP और TAR अलग-अलग दुनिया में क्यों मौजूद हैं
ZIP और TAR दो अलग-अलग कंप्यूटिंग दर्शन से आते हैं। ZIP, जो 1989 में DOS और Windows के लिए बना था, आर्काइविंग और कंप्रेशन को एक ही पैकेज में जोड़ता है। यह फ़ाइलों को व्यक्तिगत रूप से संभालता है, जिससे आप पूरे आर्काइव को डीकंप्रेस किए बिना एक फ़ाइल निकाल सकते हैं, और यह Windows-शैली के मेटाडेटा को ट्रैक करता है। TAR, जिसका पूरा नाम टेप आर्काइव है, पूरी तरह से यूनिक्स है। यह केवल एक काम करता है: यह फ़ाइलों को एक ही स्ट्रीम में जोड़ता है। बस। कंप्रेशन एक अलग कदम है, जिसे आमतौर पर gzip (.tar.gz) या bzip2 (.tar.bz2) जैसे टूल से किया जाता है। यह अंतर सिर्फ सैद्धांतिक नहीं है; इसके लिनक्स सर्वर माइग्रेशन के लिए बहुत बड़े व्यावहारिक परिणाम होते हैं। आपको एक Windows डेवलपर या cPanel बैकअप से एक ZIP फ़ाइल मिलती है, और जब आप उसे डिप्लॉय करने की कोशिश करते हैं तो अचानक आप अनुमति त्रुटियों, टूटे हुए सिम्लिंक और खोए हुए मेटाडेटा से जूझ रहे होते हैं। TAR को उन्हीं चीज़ों को संरक्षित करने के लिए बनाया गया था जिन्हें ZIP अनदेखा करता है: यूनिक्स फ़ाइल अनुमतियाँ (आपके chmod 755 और 644), स्वामित्व डेटा, सिम्लिंक और हार्ड लिंक। यह एक जीवनरक्षक है। एक आम बुरा सपना है विंडोज पर ज़िप की गई वर्डप्रेस साइट। `wp-cron.php` स्क्रिप्ट अपनी एक्ज़ीक्यूट अनुमति खो सकती है, या महत्वपूर्ण सिम्लिंक मृत फ़ाइलों में बदल सकते हैं। उसी प्रोजेक्ट को पहले .tar.gz के रूप में रीपैकेज करके, आप अपने Apache या Nginx सर्वर पर डिप्लॉय करने से पहले इन सभी समस्याओं से बच जाते हैं। ZIP से TAR में बदलना सिर्फ पसंद का मामला नहीं है; यह एक सहज, अनुमानित माइग्रेशन के लिए एक आवश्यक कदम है।
सबसे तेज़ तरीका: छोटे से मध्यम आर्काइव के लिए CocoConvert
जब आप 2 GB से कम के आर्काइव के साथ काम कर रहे हों, तो सबसे तेज़ समाधान एक ऑनलाइन टूल है। जिसने भी कभी सिर्फ एक रूपांतरण चलाने के लिए एक अस्थायी VM बनाने की परेशानी झेली है, वह जानता है कि कभी-कभी आप बस समस्या का तुरंत समाधान चाहते हैं। उसके लिए, क्लाउड का उपयोग करें। CocoConvert का [ZIP से TAR कनवर्टर](/convert/zip-to-tar) पूरी प्रक्रिया—निष्कर्षण और रीपैकेजिंग—को अपने सर्वर पर संभालता है। आपको कुछ भी इंस्टॉल करने की ज़रूरत नहीं है। इसका उपयोग करना सरल है: 1. [cocoConvert.com/convert/zip-to-tar](/convert/zip-to-tar) पर जाएं। 2. अपनी .zip फ़ाइल को पेज पर खींचें या 'फ़ाइल चुनें' बटन का उपयोग करें। 3. अपना आउटपुट प्रारूप चुनें। आप एक सादा .tar, एक कंप्रेस्ड .tar.gz, या एक .tar.bz2 प्राप्त कर सकते हैं। 4. 'कन्वर्ट' पर क्लिक करें। एक 500 MB की ZIP फ़ाइल में आमतौर पर 30 से 90 सेकंड लगते हैं, यह इस पर निर्भर करता है कि सर्वर कितने व्यस्त हैं। 5. तैयार TAR आर्काइव डाउनलोड करें। आप इसे अपने कंप्यूटर पर सहेज सकते हैं या दिए गए लिंक के साथ इसे सीधे अपने सर्वर पर खींचने के लिए `wget` का उपयोग कर सकते हैं। कौन सा प्रारूप चुनें, इस पर एक त्वरित टिप: कम डिस्क स्थान वाले सर्वर के लिए, .tar.gz आपका सबसे अच्छा दांव है। यह आमतौर पर टेक्स्ट-भारी कोडबेस को 60-70% तक छोटा कर देता है। यदि आपको पुराने हार्डवेयर पर तेज़ डीकंप्रेसन की आवश्यकता है और आप थोड़ी बड़ी फ़ाइल सहन कर सकते हैं, तो .tar.bz2 एक ठोस विकल्प है, हालांकि इसे बनाने में अधिक समय लगता है। हालांकि, सीमाओं के बारे में स्पष्ट रहें। CocoConvert त्वरित, एक बार के कामों के लिए एकदम सही है। यह 2 GB से बड़े आर्काइव, एन्क्रिप्टेड ZIP फ़ाइलों, या विशिष्ट यूनिक्स ACLs (एक्सेस कंट्रोल लिस्ट) के पूर्ण संरक्षण की मांग करने वाली स्थितियों के लिए डिज़ाइन नहीं किया गया है। उन भारी-भरकम कार्यों के लिए, आपको कमांड लाइन में उतरना होगा, जिसे हम आगे कवर करेंगे।
लिनक्स पर कमांड-लाइन रूपांतरण: बड़े आर्काइव के लिए विश्वसनीय तरीका
बड़े आर्काइव, पहले से ही रिमोट सर्वर पर मौजूद फ़ाइलों, या मुश्किल अनुमतियों वाली किसी भी चीज़ के लिए, कमांड लाइन आपका सबसे अच्छा दोस्त है। यह आपको पूरा नियंत्रण देता है। आपको बस दो उपयोगिताओं की आवश्यकता है जो लगभग हर लिनक्स सिस्टम पर होती हैं: `unzip` और `tar`। पहले, सुनिश्चित करें कि वे इंस्टॉल हैं: ``` which unzip tar ``` Debian/Ubuntu पर, आप उन्हें `sudo apt install unzip tar` से इंस्टॉल कर सकते हैं। RHEL/CentOS/AlmaLinux पर, यह `sudo dnf install unzip tar` है। प्रक्रिया अपने आप में सरल है: आप आर्काइव को एक अस्थायी डायरेक्टरी में अनज़िप करते हैं, फिर उस डायरेक्टरी को एक TAR फ़ाइल के रूप में फिर से पैक करते हैं। सबसे पहले, ZIP को एक्सट्रेक्ट करें: ``` unzip archive.zip -d ./extracted_content ``` `-d` फ्लैग का उपयोग करना अनिवार्य है। यह सामग्री के लिए एक समर्पित डायरेक्टरी बनाता है। यदि आप इसे भूल जाते हैं, तो `unzip` आपकी वर्तमान डायरेक्टरी में फ़ाइलों को हर जगह बिखेर देगा, जिससे एक बड़ी गड़बड़ी पैदा हो जाएगी जिसे आपको हाथ से साफ करना होगा। अगला, इसे एक TAR आर्काइव में पैकेज करें: ``` tar -czf archive.tar.gz -C ./extracted_content . ``` आइए इन फ्लैग्स को तोड़ते हैं। `-c` एक नया आर्काइव बनाता है, `-z` gzip कंप्रेशन जोड़ता है, और `-f` आउटपुट फ़ाइल नाम सेट करता है। `-C` फ्लैग यहाँ असली हीरो है: यह `tar` को बताता है कि आर्काइविंग शुरू करने से पहले `extracted_content` डायरेक्टरी में बदल जाए। वह अंतिम `.` इसे बताता है कि इसकी नई वर्तमान डायरेक्टरी में सब कुछ आर्काइव करना है। यह छोटी सी चाल आपको अपने आर्काइव के अंदर एक अतिरिक्त, अवांछित फ़ोल्डर स्तर प्राप्त करने से रोकती है—एक क्लासिक गलती जो डिप्लॉयमेंट पाथ को तोड़ सकती है। एक अलग कंप्रेशन चाहिए? .tar.bz2 के लिए, बस `-z` को `-j` से बदलें: ``` tar -cjf archive.tar.bz2 -C ./extracted_content . ``` और यदि आपकी फ़ाइलें पहले से ही कंप्रेस्ड हैं (जैसे चित्र या वीडियो), तो आप एक सादा, अनकंप्रेस्ड TAR बना सकते हैं: ``` tar -cf archive.tar -C ./extracted_content . ``` अस्थायी डायरेक्टरी को हटाने से पहले, हमेशा यह सुनिश्चित करने के लिए एक त्वरित जांच करें कि आर्काइव मान्य है: ``` tar -tzf archive.tar.gz | head -20 ``` यह कमांड पहली 20 फ़ाइलों को सूचीबद्ध करता है। यदि संरचना सही दिखती है, तो आप जाने के लिए तैयार हैं।
माइग्रेशन के दौरान फ़ाइल अनुमतियों और स्वामित्व को संभालना
यहां ध्यान दें, क्योंकि यह वह कदम है जहां अधिकांश ZIP-से-TAR माइग्रेशन विफल हो जाते हैं। समस्या अनुमतियों की है। ZIP में फ़ाइल विशेषताओं के लिए 16-बिट फ़ील्ड होता है, लेकिन यह ऑपरेटिंग सिस्टम के बीच बेतहाशा असंगत है। macOS से एक ZIP इसे सही कर सकता है, लेकिन डिफ़ॉल्ट Windows आर्काइवर से एक ZIP लगभग निश्चित रूप से इसे गलत कर देगा। जब आप लिनक्स पर `unzip` चलाते हैं, तो टूल अनुमतियों का अनुमान लगाने की पूरी कोशिश करता है। यह आमतौर पर आपके सिस्टम के umask (जो आमतौर पर 022 होता है) के आधार पर फ़ाइलों के लिए 644 और डायरेक्टरी के लिए 755 पर डिफ़ॉल्ट होता है। जबकि यह अधिकांश वेब संपत्तियों के लिए ठीक है, यह किसी भी स्क्रिप्ट के लिए एक डील-ब्रेकर है जिसे चलाने के लिए एक्ज़ीक्यूट अनुमतियों की आवश्यकता होती है। एकमात्र विश्वसनीय समाधान यह है कि आप TAR आर्काइव बनाने से *पहले* अनुमतियों को स्वयं ठीक करें। `find` के साथ उनका ऑडिट और सुधार करें: ``` # सभी फ़ाइलों को एक सुरक्षित डिफ़ॉल्ट (644) पर सेट करें find ./extracted_content -type f -exec chmod 644 {} \; # सभी डायरेक्टरी को एक सुरक्षित डिफ़ॉल्ट (755) पर सेट करें find ./extracted_content -type d -exec chmod 755 {} \; # स्पष्ट रूप से स्क्रिप्ट को एक्ज़ीक्यूटेबल बनाएं find ./extracted_content -name '*.sh' -exec chmod 755 {} \; ``` स्वामित्व पहेली का दूसरा आधा हिस्सा है। यदि आप एक वेब ऐप को स्थानांतरित कर रहे हैं, तो इसकी फ़ाइलों का स्वामी शायद `www-data` (Debian/Ubuntu पर) या `nginx` या `apache` (RHEL सिस्टम पर) होना चाहिए। आर्काइव बनाने से पहले स्वामित्व सेट करें, खासकर यदि कोई डिप्लॉयमेंट स्क्रिप्ट इस पर निर्भर करती है: ``` sudo chown -R www-data:www-data ./extracted_content ``` TAR ईमानदारी से उस स्वामित्व और अनुमतियों को संरक्षित करता है जो आपके आर्काइव बनाते समय मौजूद होती हैं। उन्हें पहले से सही कर लें, और आपका डिप्लॉयमेंट एक साधारण निष्कर्षण बन जाता है—अब और गन्दा पोस्ट-डिप्लॉयमेंट `chmod` स्क्रिप्ट नहीं। स्वचालित डिप्लॉयमेंट के लिए, यह ZIP फ़ाइलों से जूझने पर एक बहुत बड़ी परिचालन जीत है।
माइग्रेशन स्क्रिप्ट में ZIP-से-TAR रूपांतरण को स्वचालित करना
यदि आप एक से अधिक फ़ाइल परिवर्तित कर रहे हैं, तो इसे स्वचालित करें। चाहे आप दर्जनों साइटों का माइग्रेशन कर रहे हों या सिर्फ एक cPanel सर्वर से साप्ताहिक ZIP बैकअप को संसाधित कर रहे हों, एक स्क्रिप्ट आपका बहुत समय बचाएगी और साधारण गलतियों को रोकेगी। यह शेल स्क्रिप्ट एक बेहतरीन शुरुआती बिंदु है। यह एक स्रोत डायरेक्टरी में हर ZIP फ़ाइल को ढूंढती है, इसे परिवर्तित करती है, और परिणामी TAR फ़ाइल को एक गंतव्य डायरेक्टरी में रखती है। ```bash #!/bin/bash SOURCE_DIR="/srv/backups/zip" DEST_DIR="/srv/backups/tar" TMP_DIR="/tmp/zip_conversion" mkdir -p "$DEST_DIR" "$TMP_DIR" for zipfile in "$SOURCE_DIR"/*.zip; do basename=$(basename "$zipfile" .zip) extract_path="$TMP_DIR/$basename" echo "Processing: $basename" mkdir -p "$extract_path" unzip -q "$zipfile" -d "$extract_path" # Fix permissions find "$extract_path" -type f -exec chmod 644 {} \; find "$extract_path" -type d -exec chmod 755 {} \; tar -czf "$DEST_DIR/${basename}.tar.gz" -C "$extract_path" . # Verify before cleanup if tar -tzf "$DEST_DIR/${basename}.tar.gz" > /dev/null 2>&1; then echo "Success: ${basename}.tar.gz" rm -rf "$extract_path" else echo "ERROR: Conversion failed for $basename" >&2 fi done rm -rf "$TMP_DIR" ``` इसका उपयोग करने के लिए, कोड को `convert_zips.sh` के रूप में सहेजें, इसे `chmod 755 convert_zips.sh` के साथ एक्ज़ीक्यूटेबल बनाएं, और फिर इसे `./convert_zips.sh` के माध्यम से चलाएं। सुरक्षा जांच पर ध्यान दें: स्क्रिप्ट यह सत्यापित करती है कि नया TAR आर्काइव पठनीय है, इससे पहले कि वह अस्थायी निकाली गई फ़ाइलों को हटा दे। यह एक महत्वपूर्ण कदम है जो आपको `tar` कमांड के दौरान कुछ गलत होने पर गलती से डेटा खोने से बचाता है। इसे स्वचालित रूप से चलाने के लिए, बस इसे एक क्रॉन जॉब में जोड़ें। यह उदाहरण स्क्रिप्ट को हर दिन सुबह 2 बजे चलाता है और सभी आउटपुट को लॉग करता है: `0 2 * * * /srv/scripts/convert_zips.sh >> /var/log/zip_conversion.log 2>&1`।
आम त्रुटियाँ और उन्हें कैसे ठीक करें
देर-सबेर, एक रूपांतरण विफल हो जाएगा। ऐसा होता है। यहाँ सबसे आम त्रुटियाँ हैं जिनका सामना आप ZIP को TAR में बदलते समय करेंगे और उनसे कैसे पार पाया जाए। **'End-of-central-directory signature not found'** इसका लगभग हमेशा मतलब होता है कि आपकी ZIP फ़ाइल भ्रष्ट या अधूरी है। मूल स्रोत के मुकाबले इसके आकार की जांच करें और इसे फिर से डाउनलोड करने का प्रयास करें। अंतिम उपाय के रूप में, आप इसे सुधारने का प्रयास कर सकते हैं: `zip -FF corrupted.zip --out repaired.zip` **unzip के दौरान 'Cannot allocate memory'** यह आमतौर पर RAM के बारे में नहीं है। यह फ़ाइल डिस्क्रिप्टर के बारे में है। लाखों छोटी फ़ाइलों वाला एक आर्काइव सिस्टम की सीमा को समाप्त कर सकता है। अपने वर्तमान शेल सत्र के लिए `ulimit -n 65536` के साथ सीमा बढ़ाएँ और फिर पुनः प्रयास करें। **TAR में सिम्लिंक का गायब होना** यदि आपके सिम्लिंक लिंक पथ को धारण करने वाली सादी टेक्स्ट फ़ाइलों में बदल जाते हैं, तो हो सकता है कि आप `unzip` का एक पुराना संस्करण उपयोग कर रहे हों जो उन्हें गलत तरीके से संभालता है (कुछ संस्करणों में `-X` फ्लैग की आवश्यकता होती है)। `unzip -v` के साथ जांचें और यदि आप 6.0 से पुराने किसी भी संस्करण पर हैं तो अपग्रेड करें। एक अधिक मजबूत विकल्प पायथन के `zipfile` मॉड्यूल का उपयोग करना है, जो सिम्लिंक को संरक्षित करने में बहुत अच्छा है: `python3 -c "import zipfile; zipfile.ZipFile('archive.zip').extractall('extracted/')"`। **स्पेस वाले फ़ाइल नाम tar को तोड़ रहे हैं** आह, क्लासिक "स्पेस वाले फ़ाइल नाम" की समस्या। यह अनुमतियों को ठीक करने के लिए उपयोग किए जाने वाले सरल `find` कमांड को गड़बड़ा सकता है। इसे संभालने का अचूक तरीका `find` के `-print0` विकल्प को `xargs -0` में पाइप करना है: `find ./extracted_content -type f -print0 | xargs -0 chmod 644` **/tmp के लिए आर्काइव बहुत बड़ा है** कई सिस्टम `/tmp` को RAM में `tmpfs` विभाजन के रूप में कॉन्फ़िगर करते हैं, जो अक्सर आपकी कुल मेमोरी के आधे तक सीमित होता है। यदि आपका आर्काइव बहुत बड़ा है, तो यह विफल हो जाएगा। आप या तो `unzip` को एक वास्तविक डिस्क पर एक अलग अस्थायी डायरेक्टरी का उपयोग करने के लिए कह सकते हैं (`export TMPDIR=/var/tmp`) या, बेहतर है, बस `-d` फ्लैग के साथ सीधे एक डिस्क-समर्थित निष्कर्षण पथ निर्दिष्ट करें। **बड़ी फ़ाइलों पर CocoConvert का टाइमआउट होना** हमारा वेब टूल सुविधा के लिए बनाया गया है, न कि विशाल फ़ाइलों के लिए। 2 GB से अधिक की कोई भी चीज़ संभवतः टाइम आउट हो जाएगी। यह अधिकांश ब्राउज़र-आधारित अपलोड के लिए एक कठिन सीमा है। बड़े कामों के लिए, आपको कमांड-लाइन विधि का उपयोग करना होगा।
अपने सर्वर वातावरण के लिए सही TAR कंप्रेशन चुनना
आप TAR के साथ जो कंप्रेशन जोड़ते हैं वह सिर्फ एक विवरण नहीं है; यह माइग्रेशन की गति, डिस्क उपयोग और डिप्लॉयमेंट के दौरान सर्वर के प्रदर्शन को भी प्रभावित करता है। यहाँ सही का चुनाव कैसे करें। **.tar.gz (gzip)** यह एक कारण से उद्योग मानक है। यह एक अच्छा कंप्रेशन अनुपात प्रदान करता है (आमतौर पर कोड पर 3:1 से 5:1), जल्दी से डीकंप्रेस होता है (एक 1 GB .tar.gz एक आधुनिक सर्वर पर लगभग 15 सेकंड में अनपैक हो जाता है), और यह सार्वभौमिक रूप से समर्थित है। मेरी सलाह? बस इसका इस्तेमाल करें। जब तक आपके पास कुछ और चुनने का कोई बहुत विशिष्ट, ठोस कारण न हो, .tar.gz ही सही जवाब है। **.tar.bz2 (bzip2)** यह आपको एक ऐसी फ़ाइल देगा जो gzip से लगभग 10-15% छोटी है, लेकिन एक महत्वपूर्ण कीमत पर: कंप्रेशन 3-4 गुना धीमा है। डीकंप्रेसन भी धीमा है। यह एक ऐसा समझौता है जो केवल दीर्घकालिक संग्रह के लिए मायने रखता है जहां हर गीगाबाइट मायने रखता है, न कि सक्रिय डिप्लॉयमेंट के लिए। **.tar.xz (xz/LZMA)** यह सबसे अच्छा कंप्रेशन प्रदान करता है, अक्सर स्रोत कोड को gzip से 20-30% अधिक सिकोड़ता है। लेकिन डीकंप्रेसन धीमा है और मेमोरी का भूखा है—एक 500 MB .tar.xz केवल अनपैक करने के लिए आसानी से 700 MB RAM खा सकता है। आपको माइग्रेशन के लिए इससे बचना चाहिए, खासकर यदि आप सीमित संसाधनों वाले सर्वर पर डिप्लॉय कर रहे हैं। **.tar (कोई कंप्रेशन नहीं)** जो पहले से ही कंप्रेस्ड है उसे कंप्रेस न करें। यदि आपका आर्काइव JPEG छवियों, MP4 वीडियो, या पहले से कंप्रेस्ड डेटाबेस डंप से भरा है, तो इसे gzip में लपेटना लगभग शून्य आकार लाभ के लिए CPU चक्रों की बर्बादी है। इस मामले में, एक सादा .tar सबसे कुशल विकल्प है। लगभग किसी भी वेब-संबंधित माइग्रेशन के लिए—PHP एप्लिकेशन, Node.js प्रोजेक्ट, या पायथन कोडबेस—.tar.gz ही सबसे अच्छा तरीका है। यह वही है जो Capistrano, Deployer, और Ansible के अनआर्काइव मॉड्यूल जैसे डिप्लॉयमेंट टूल उम्मीद करते हैं, और यह गति, आकार और संगतता का सबसे अच्छा संतुलन प्रदान करता है। यदि आप एक बार का रूपांतरण कर रहे हैं और कमांड-लाइन फ्लैग की बारीकियों में नहीं पड़ना चाहते हैं, तो CocoConvert का [ZIP से TAR कनवर्टर](/convert/zip-to-tar) आपको सबसे व्यावहारिक विकल्प— .tar, .tar.gz, और .tar.bz2—सीधे ब्राउज़र में देता है। यह एक अच्छा शॉर्टकट है जब आपको बस काम पूरा करना होता है।