टार: वर्तमान निर्देशिका INCLUDING .svn और इतने पर सभी फ़ाइलों और निर्देशिकाओं को जोड़ें


89

मैं एक निर्देशिका का उपयोग और उपयोग करने की कोशिश करता हूं

tar -czf workspace.tar.gz *

परिणामी टार .svnमें उप-निर्देशिकाओं में निर्देशिकाएँ शामिल हैं लेकिन वर्तमान निर्देशिका में नहीं (जैसा *कि टार पास करने से पहले केवल 'दृश्यमान' फ़ाइलों तक विस्तारित हो जाता है)

मैने कोशिश कि

tar -czf workspace.tar.gz .इसके बजाय, लेकिन फिर मुझे एक त्रुटि मिल रही है क्योंकि '।' पढ़ते समय बदल गया है:

tar: ./workspace.tar.gz: file changed as we read it

क्या कोई ऐसा ट्रिक है जो *डायरेक्टरी में सभी फाइलों (डॉट-प्रीफिक्सड सहित) से मेल खाता है?

(लिनक्स SLES-11 (2.6.27.19) पर बैश का उपयोग करके)


5
शायद यह सवाल सुपरसुसर पर है?
पीटर जरीक

जवाबों:


75

उस निर्देशिका में टार फ़ाइल न बनाएं जिसे आप पैक कर रहे हैं:

tar -czf /tmp/workspace.tar.gz .

चाल है, सिवाय इसके कि जब आप अनपैक करते हैं, तो यह सभी वर्तमान निर्देशिका में फ़ाइलों को निकालेगा। बेहतर करने के लिए:

cd ..
tar -czf workspace.tar.gz workspace

या, यदि आप उस निर्देशिका का नाम नहीं जानते हैं जो आप में थे:

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(यह मानता है कि जहाँ आप हैं, वहाँ पहुँचने के लिए आपने सिम्बलिंक का पालन नहीं किया है और यह शेल आपको सिम्लिंक के माध्यम से पीछे की ओर कूदकर दूसरा अनुमान लगाने की कोशिश नहीं करता है - bashइस संबंध में विश्वसनीय नहीं है। यदि आपको इसके बारे में चिंता करनी है। cd -P ..एक भौतिक परिवर्तन निर्देशिका करने के लिए उपयोग करें। बेवकूफ है कि यह मेरे विचार में डिफ़ॉल्ट व्यवहार नहीं है - भ्रामक, कम से कम, उन लोगों के लिए जिनके लिए cd ..कभी कोई वैकल्पिक अर्थ नहीं था।)


चर्चा में एक टिप्पणी कहती है:

मुझे [...] को शीर्ष निर्देशिका से बाहर करने की आवश्यकता है और मुझे [...] को आधार निर्देशिका में टार को रखने की आवश्यकता है।

टिप्पणी का पहला भाग बहुत मायने नहीं रखता है - यदि टार फ़ाइल में वर्तमान निर्देशिका है, तो यह तब नहीं बनेगी जब आप उस संग्रह से फ़ाइल निकालेंगे, क्योंकि परिभाषा के अनुसार, वर्तमान निर्देशिका पहले से मौजूद है (बहुत अजीब परिस्थितियों को छोड़कर) )।

टिप्पणी के दूसरे भाग को एक दो तरीकों से निपटाया जा सकता है:

  1. या तो: फ़ाइल को कहीं और बनाएं - /tmpएक संभावित स्थान है - और फिर इसे पूरा होने के बाद मूल स्थान पर वापस ले जाएं।
  2. या: यदि आप जीएनयू टार का उपयोग कर रहे हैं, तो --exclude=workspace.tar.gzविकल्प का उपयोग करें । स्ट्रिंग =एक पैटर्न के बाद है - उदाहरण सबसे सरल पैटर्न है - एक सटीक मिलान। आपको यह निर्दिष्ट करने की आवश्यकता हो सकती है कि --exclude=./workspace.tar.gzक्या आप वर्तमान निर्देशिका में सिफारिशों के विपरीत काम कर रहे हैं; --exclude=workspace/workspace.tar.gzयदि आप सुझाए गए अनुसार एक स्तर पर काम कर रहे हैं, तो आपको निर्दिष्ट करने की आवश्यकता हो सकती है । यदि आपके पास बहिष्कृत करने के लिए कई टार फाइलें हैं, तो ' *' का उपयोग करें , जैसे कि --exclude=./*.gz

1
अच्छा जवाब लेकिन मुझे एक ऐसी स्थिति मिली है जहां मुझे इस कमांड को निर्देशिका के अंदर चलाने के लिए मजबूर किया गया है जिसे पैक करना होगा। मेरे पास इसे चलाने के लिए अपर्याप्त अनुमति है।
हेक्सोडस

पैक करने के लिए एक सही जगह सुनिश्चित करने के लिए / tmp है।
आंद्रे फैलो

45

यदि आप वास्तव में टारबॉल में शीर्ष निर्देशिका को शामिल नहीं करना चाहते हैं (और यह आमतौर पर बुरा विचार है):

tar czf workspace.tar.gz -C /path/to/workspace .

मुझे शीर्ष निर्देशिका को बाहर करने की आवश्यकता है और मुझे आधार निर्देशिका में टार को रखने की आवश्यकता है।
मीका

@ मिचा एक बैश स्क्रिप्ट को आर्काइव करने और फाइल को कॉपी करने के बाद
Fedir RYKHTIK

2
आप मुझे याद कर रहे हैं -czf।
अपरान्ह

10
मैन टार: टार को पहला तर्क एक फ़ंक्शन होना चाहिए; या तो अक्षरों Acdrtuxमें से एक, या लंबे फ़ंक्शन नामों में से एक। एक फ़ंक्शन पत्र के साथ उपसर्ग की आवश्यकता नहीं है- , और अन्य एकल-अक्षर विकल्पों के साथ जोड़ा जा सकता है।
rkhayrov

4
अभी भी काम नहीं करता है, मेरे पास अभी भी "है।" मेरे टारबॉल में शीर्ष निर्देशिका के रूप में
ए गिले

43

वहाँ कुछ कदम उठाए हैं:

  1. बदलें *द्वारा .छिपा फ़ाइलों को शामिल करने के साथ-साथ।
  2. उसी डायरेक्टरी में आर्काइव बनाने के लिए आर्काइव को --exclude=workspace.tar.gzखुद से बाहर करने के लिए इस्तेमाल किया जा सकता है।
  3. tar: .: file changed as we read itजब संग्रह अभी तक नहीं बना है, तो त्रुटि को रोकने के लिए , सुनिश्चित करें कि यह मौजूद है (उदाहरण का उपयोग करके touch), इसलिए --exclude संग्रह फ़ाइल नाम के साथ मेल खाता है। (यह फ़ाइल मौजूद नहीं है, यह मेल नहीं खाता)

इस परिणाम को निम्न स्क्रिप्ट में संयोजित करें:

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

7
मैंने सभी उत्तरों और टिप्पणियों को पढ़ा और यह उसी डायर में टारबॉल बनाने का सबसे अच्छा तरीका है। इस उत्तर से मुझे यह भी समझ में आया कि यह त्रुटि क्यों होती है।
१६:४ł पर सिजोमोन साडालो

यदि आप अपनी टार फ़ाइल को संपीड़ित करते समय प्रगति देखना चाहते हैं, तो आप इसके लिए एक अतिरिक्त ध्वज जोड़ सकते हैं --verbose, जैसे -czvf:।
मस्तरीनी

18

निर्देशिका में (वर्तमान निर्देशिका) सेक करना चाहते हैं:

tar -czf workspace.tar.gz . --exclude=./*.gz

2
लेकिन अब यह शिकायत करता है कि फ़ाइल "।" पढ़ा जा रहा है, जबकि बदल गया है। क्या मुझे यकीन है कि सभी फाइलों को शामिल किया गया है?
जाँ

1
यह .gzनिर्देशिका की सभी फ़ाइलों को शामिल नहीं करता है ।
ोमर्फारुकडोगन

12

आप एक निर्देशिका को वापस जाकर और छिपा कर निर्देशिकाओं को शामिल कर सकते हैं:

cd ..
tar czf workspace.tar.gz workspace

उस निर्देशिका को मान लेना जिसे आप gzip करना चाहते थे, कार्यक्षेत्र कहलाता है।


और यह बदलती फ़ाइल समस्या से भी बचता है।
जोनाथन लेफ्लर 15

तब काम नहीं करता है जब उपयोगकर्ता के पास पैरेंट फ़ोल्डर में कोई लिखित अनुमति नहीं है।
जोकिम वैगनर

बिल्कुल @JoachimWagner!
p01ymath

1
@JoachimWagner। यदि आपके पास लिखने की अनुमति नहीं है, तो इसे बदल दें:tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
तेज करें

1
मुझे इसे काम करने से -पहले बाहर निकालना पड़ा czf। अन्यथा मुझे Cannot stat: No such file or directoryत्रुटि संदेश मिल रहा था ।
फेमेलो खेथो

6

आप .का उपयोग करके प्रपत्र को ठीक कर सकते हैं --exclude:

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

5

अपडेट: मैंने ओपी की टिप्पणी के लिए एक फिक्स जोड़ा।

tar -czf workspace.tar.gz .

वास्तव में वर्तमान निर्देशिका को बदल देगा, लेकिन फ़ाइल को कहीं और क्यों न रखें?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update

फ़ाइल को बाद में संसाधित किया जाएगा और कार्यक्षेत्र में होना आवश्यक है - यह थोड़ी सी बोली बदसूरत है लेकिन यह सिर्फ जरूरत है (पूरी बात सिर्फ एक समाधान है ...)
माइक

ठीक है, मैं उस के लिए एक फिक्स जोड़ दूंगा :)
पीटर जेरी सेप

और अगर आपको इसे बार-बार चलाने में सक्षम होना है, तो टार लाइन से पहले 'rm workspace.tar.gz' जोड़ें।
पीटर जरीक

यदि आप एक ही ड्राइव में एक पूरे ड्राइव को टार करना चाहते हैं , तो ऐसा लगता है कि आपके पास कई विकल्प नहीं हैं।
BeeOnRope

4

वास्तव में समस्या संपीड़न विकल्पों के साथ है। ट्रिक एक अंतर्निहित कंप्रेसर विकल्पों का उपयोग करने के बजाय एक कंप्रेसर के लिए टार परिणाम पाइप है। संयोग से वह आपको बेहतर संपीड़न भी दे सकता है, क्योंकि आप अतिरिक्त अतिरिक्त विकल्प चुन सकते हैं।

न्यूनतम टार:

tar --exclude=*.tar* -cf workspace.tar .

अपनी पसंद के कंप्रेसर से पाइप। यह उदाहरण क्रिया है और अधिकतम संपीड़न के साथ xz का उपयोग करता है:

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

समाधान 7 पर Ubuntu 14.04 और Cygwin पर परीक्षण किया गया था। यह एक सामुदायिक विकी उत्तर है, इसलिए यदि आप कोई गलती करते हैं तो संपादित करने के लिए स्वतंत्र महसूस करें।


धन्यवाद! सहेजा गया मा जीवन
स्टीवन

2

यहां प्रदान किए गए सबसे अधिक समाधानों के साथ समस्या यह है कि टार में ./हर प्रविष्टि के भिक्षाटन में शामिल हैं । तो यह .GUI कंप्रेसर के माध्यम से खोलने पर निर्देशिका होने का परिणाम है । तो मैंने जो किया, वह है:

ls -1A | xargs -d "\n" tar cfz my.tar.gz

यदि आपके पास पहले से ही my.tar.gzवर्तमान निर्देशिका में है तो आप इसे समाप्त कर सकते हैं:

ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

इस बात से अवगत रहें कि xargs की निश्चित सीमा (देखें xargs --show-limits) है। तो यह समाधान काम नहीं करेगा यदि आप एक ऐसी पैकेज बनाने की कोशिश कर रहे हैं जिसमें बहुत सारी प्रविष्टियाँ (निर्देशिकाएँ और फाइलें) हैं जो एक निर्देशिका पर है जिसे आप टार करने की कोशिश कर रहे हैं।


1

एक अच्छा सवाल। ZSH में आप (D)ग्लोबिंग संशोधक का उपयोग कर सकते हैं , जो "डॉटफाइल्स" के लिए खड़ा है। की तुलना करें:

ls $HOME/*

तथा

ls $HOME/*(D)

यह विशेष निर्देशिका प्रविष्टियों को सही ढंग से बाहर करता है .और ..। बाश में आप .*dotfiles को स्पष्ट रूप से शामिल करने के लिए उपयोग कर सकते हैं :

ls $HOME/* $HOME/.*

लेकिन इसमें शामिल है .और ..साथ ही, इसलिए यह वह नहीं है जिसकी आपको तलाश थी। मुझे यकीन है कि *बैश में भी मैच डॉटफाइल्स बनाने का कोई तरीका है।


बैश में, .??*सभी डॉट फ़ाइलों से मिलान करने के लिए उपयोग करें .और नहीं ..। कि एकल चरित्र डॉट फ़ाइलें (जैसे .a) नहीं मिलती हैं । उन लोगों को भी प्राप्त करने के लिए, अधिक जटिल का उपयोग करें .[^.]*
स्कॉट मिनस्टर

1

फिर भी एक और समाधान, फ़ोल्डर में आइटमों की संख्या को मानना ​​बहुत बड़ा नहीं है:

tar -czf workspace.tar.gz `ls -A`

( ls -Aसामान्य और छिपी हुई फ़ाइलों को प्रिंट करता है, लेकिन "" और ".." जैसा ls -aनहीं करता है।)


0
tar -czf workspace.tar.gz .??* *

निर्दिष्ट करने .??*में "डॉट" फाइलें और निर्देशिकाएं शामिल होंगी, जिसमें डॉट के बाद कम से कम 2 अक्षर हैं। नीचे की ओर यह है कि इसमें डॉट के बाद एक एकल वर्ण के साथ फाइल / निर्देशिका शामिल नहीं होगी, जैसे कि .aयदि कोई हो।


0

यदि डिस्क स्पेस स्पेस कोई समस्या नहीं है, तो यह करना भी बहुत आसान काम हो सकता है:

mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup

0

खुद भी ऐसी ही स्थिति थी। मुझे लगता है कि टार को कहीं और बनाना सबसे अच्छा है और फिर संकुचित निर्देशिका फ़ाइलों के लिए टार बेस डायरेक्टरी को बताने के लिए -C का उपयोग करें। उदाहरण:

tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)

इस तरह से अपने स्वयं के टारफाइल को बाहर करने की आवश्यकता नहीं है। जैसा कि अन्य टिप्पणियों में उल्लेख किया गया है, -ए छिपी हुई फाइलों को सूचीबद्ध करेगा।


0

10 साल बाद, आपके पास एक विकल्प है tar, जिसका वर्णन Git 2.30 (Q1 2021) के साथ किया गया है, जो कि टार के बजाय रिलीज टारबॉल का उत्पादन करने के लिए " git archive" ( आदमी ) का उपयोग करता है । (आपको उस विकल्प को लागू करने के लिए Git 2.30 की आवश्यकता नहीं है)

4813277 (11 अक्टूबर 2020) प्रतिबद्ध देखें , और रेने श्राफे ( ) द्वारा 93e7031 (10 अक्टूबर 2020) प्रतिबद्ध हैं(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 63e5273 27 अक्टूबर 2020)rscharfe
gitster

Makefile: Dist-doc के लिए git init / add / प्रतिबद्ध / संग्रह का उपयोग करें

साइन-ऑफ-बाय: रेने शार्फ

HTML प्रलेखन के लिए वितरण अभिलेखागार उत्पन्न करके बाहरी उपकरणों पर निर्भरता को कम करें और टार के बजाय ( मैन ) कमांड का उपयोग करके मैनपेज करें । यह संग्रह प्रविष्टियों को उन्हीं मेटा डेटा के रूप में प्रदान करता है जो द्विपदीय के लिए अंतर संग्रह में हैं।git

इसलिए इसके बजाय:

tar cf ../archive.tar .

आप केवल Git का उपयोग कर सकते हैं:

git -C workspace init
git -C workspace add .
git -C workspace commit -m workspace
git -C workspace archive --format=tar --prefix=./ HEAD^{tree} > workspace.tar
rm -Rf workspace/.git

यह शुरू में प्रस्तावित किया गया था, क्योंकि यहां बताया गया है , कुछ विदेशी मंच में कमी के विकल्प के साथ एक पुराना टार वितरण हो सकता है।


-1

उपयोग करना findशायद सबसे आसान तरीका है:

find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+

find . -maxdepth 1वर्तमान निर्देशिका में सभी फाइलें / निर्देशिका / सहानुभूति / आदि पा सकते हैं और इसके द्वारा निर्दिष्ट कमांड को चला सकते हैं -exec{}आदेश साधन में फ़ाइल सूची यहाँ जाता है और \+इसका मतलब है कि आदेश के रूप में चलाया जाएगा:

tar zcvf workspace.tar.gz .file1 .file2 .dir3

के बजाय

tar zcvf workspace.tar.gz .file1
tar zcvf workspace.tar.gz .file2
tar zcvf workspace.tar.gz .dir3

-J है - मैनुअल में xz; -सी के साथ संयुक्त सिर्फ एक शुरुआत है जो एक कंप्यूटर "मजेदार"
कहेगा

हाहा, घर पर मेरा मिनी-सर्वर सीपीयू की तुलना में डिस्क स्पेस द्वारा अधिक सीमित है। हालांकि अच्छा बिंदु; मैं इसे gzip का उपयोग करने के लिए बदल दूँगा।
एंड्रयू गुनर्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.