सभी 'dotfiles' सहित टार का उपयोग करके संग्रह बनाना लेकिन सभी उपनिर्देशिका और / wo निर्देशिका संरचना को छोड़कर


18

मैं .zshrcअपने घर निर्देशिका के अंतर्गत सभी 'dotfiles' (fe ) को टार के साथ बैकअप देना चाहता हूं , लेकिन निर्देशिका संरचना और सभी उपनिर्देशिकाओं को छोड़कर।

मैंने इसे कई बार अलग-अलग कमांडों के साथ आज़माया है, लेकिन मैंने जो सर्वश्रेष्ठ हासिल किया वह एक संग्रह था जिसमें छिपी हुई निर्देशिकाओं $HOMEको भी शामिल किया गया था ।

#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*

मैंने findपरिणाम को टार करने के लिए उपयोग करने और पाइप करने के बारे में भी सोचा , लेकिन भाग्य नहीं। किसी को पता है कि यह कैसे प्राप्त करने के लिए - प्रतीत होता है आसान - कार्य?

पुनश्च: अधिकांश समय जब मैं एक संग्रह बनाने के लिए टार का उपयोग कर रहा हूं, मुझे xkcd कॉमिक के बारे में सोचना है:

xkcd 1168 :)


सिम का जवाब काम करता है, लेकिन अगर किसी को एक regex मिला जो केवल छिपी हुई फ़ाइलों से मेल खाता है, तो कृपया इसे पोस्ट करें!
klingt.net

1
निश्चित रूप से यह आपके शेल के साथ बेहतर होगा। मैं समझता हूं कि zsh के पास ग्लब्स हैं जो केवल फ़ाइलों का चयन करते हैं *(.)- और मुझे लगता है कि यह डिफ़ॉल्ट रूप से .और बाहर ..से आता .*है (और वे .*(.)वैसे भी नहीं उठाए जाएंगे , क्योंकि यह केवल फ़ाइलों का चयन करता है)। मैं खुद को zsh का उपयोग नहीं करता, इसलिए मुझे यकीन नहीं है कि इसे उत्तर में बदल दिया जाएगा।
२०

जवाबों:


14

आप .<something>अपनी $HOMEनिर्देशिका में अपने सभी dotfiles ( ) बैकअप के लिए इस कमांड का उपयोग कर सकते हैं :

$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +

regex सिर्फ टार का उपयोग कर?

विधि # 1

मैंने इस पर काफी शोध किया और खाली आया। सीमित कारक यह होगा कि जब tarयह प्रदर्शन कर रहा है तो इसे बाहर रखा जाए, ट्रेसिंग स्लैश ( /) जो निर्देशिकाओं के साथ दिखाती है, यह उस समीकरण का हिस्सा नहीं है जब टार अपना पैटर्न मैच कर रहा हो।

यहाँ एक उदाहरण है:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory

इस संस्करण में एक बहिष्करण शामिल है .*/और आप टरबाइन चालू किए गए क्रिया स्विच के साथ देख सकते हैं -v, कि ये निर्देशिकाएं इस बहिष्करण से गुजर रही हैं।

विधि # 2

मैंने सोचा कि शायद स्विच --no-wildcards-match-slashया --wildcards-match-slashलालच आराम कर देगा, .*/लेकिन इसका भी कोई असर नहीं हुआ।

स्लैश को बाहर रखना , .*कोई विकल्प नहीं था , क्योंकि यह tarसभी डॉटफाइल्स और डॉट इनकम को बाहर करने के लिए कहेगा:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$

विधि # 3 (बदसूरत!)

इसलिए मैं केवल अन्य विकल्प जो गर्भधारण कर सकता हूं वह है फाइलों की एक सूची प्रदान करना tar। कुछ इस तरह:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory

इस दृष्टिकोण में समस्याएँ हैं यदि फ़ाइलों की संख्या कमांड के लिए तर्कों को पारित करने के लिए अधिकतम मात्रा में जगह है, तो एक चमकता मुद्दा होगा। दूसरा यह है कि यह बदसूरत और अति जटिल है।

तो, हमने क्या सीखा?

इस का उपयोग करते हुए tarऔर नियमित रूप से अभिव्यक्त करने के लिए एक सीधा-आगे और सुरुचिपूर्ण तरीका प्रतीत नहीं होता है । तो @ टेर्डन की टिप्पणी के अनुसार, find ... | tar ...वास्तव में ऐसा करने का अधिक उपयुक्त तरीका है।


मैं वास्तव में इसके साथ काम करना चाहता था regex, लेकिन मुझे पता होना चाहिए कि यह उस तरह से काम नहीं करेगा :)
klingt.net

@ klingt.net - यह संभव होना चाहिए, मैं अभी देख रहा हूं।
स्लम

@ klingt.net आप अधिक जटिल तरीके को क्यों पसंद करेंगे? उपयोग करने से regexआपको अग्रणी डॉट से बचने की आवश्यकता होगी .और अनदेखी करने में परेशानी होगी ..। मुझे यकीन है कि यह संभव है क्योंकि स्लम शायद प्रदर्शित करेगा लेकिन मैं यह नहीं देखता कि यह सार्थक क्यों होगा।
terdon

1
@ klingt.net - जो कुछ भी findकमांड को मिल जाता है वह एक तर्क के रूप में पास हो जाता है tar। यह {}कहता है कि आप कहाँ चाहते हैं कि परिणाम इसी -execक्रम में जाएं। +से कई परिणाम के रूप में जोड़ने के लिए कहते हैं findके रूप में कमांड लाइन पर फिट और फोन करेगा tarबल्कि हर बार एक परिणाम पाया जाता है की तुलना में केवल समय की एक जोड़ी।
स्लम

1
@ klingt.net - इसका उपयोग करके इसे पूरा करने का कोई तरीका नहीं है regexऔर tarक्योंकि डॉट निर्देशिकाओं ( .blah/) को अलग करने का कोई तरीका नहीं है । टार बहिष्करण करते समय अनुगामी स्लैश का उपयोग नहीं करता है
स्लम

4

मिलान फ़ाइलों पर इस तरह का नियंत्रण टार के आराम क्षेत्र के बाहर का रास्ता है। फाइलों के मिलान के लिए इसके नियम नामों पर साधारण मैचों तक ही सीमित हैं।

find एक ही रास्ता है, लेकिन जब से आप zsh है, आप इसे आसान है:

tar -cf "$HOME/$BACKUPFILE" --auto-compress .*(.)

यही कारण है कि .वाइल्डकार्ड अभिव्यक्ति के अंत में कोष्ठक में एक है ग्लोब क्वालीफायर कि कहते हैं, "केवल नियमित रूप से फ़ाइलों से मेल खाते हैं।"

नियमित फ़ाइलों के प्रतीकात्मक लिंक मेल नहीं खाते हैं। यदि आप इसमें बदलाव करते हैं .*(-.), तो उन्हें शामिल किया जाएगा, लेकिन फ़ाइल तब तक संग्रह में समाप्त नहीं होगी जब तक कि यह भी शामिल न हो। यदि आप प्रतीकात्मक लिंक को उनके लक्ष्य से बदलना चाहते हैं, तो वह बनाएं .*(-.:A)इतिहास विस्तार संशोधक को:A जोड़ता है जो सभी प्रतीकात्मक लिंक को एक पथ से जोड़ता है जो प्रतीकात्मक लिंक का उपयोग नहीं करता है।


3

यह उत्तर स्लम पर आधारित है, लेकिन मैं आपको यह भी दिखाऊंगा कि कैसे निर्देशिका को शामिल करना है .

अपने घर निर्देशिका में डॉट फ़ाइलों को ज़िप करने के लिए:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

निर्देशिकाओं को शामिल करने के लिए:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

?पहले आदेश में वैकल्पिक है, लेकिन नहीं दूसरे में, अन्यथा, findशामिल होंगे .(वर्तमान) निर्देशिका।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.