निर्देशिका को टार कैसे करें और फिर निर्देशिका सहित मूल को हटा दें?


30

मैं tar'my_directory' नामक एक निर्देशिका में फ़ाइलों के संग्रह की कोशिश कर रहा हूं और कमांड का उपयोग करके मूल को हटा सकता हूं:

tar -cvf files.tar my_directory --remove-files

हालाँकि यह केवल निर्देशिका के अंदर व्यक्तिगत फ़ाइलों को हटा रहा है न कि स्वयं निर्देशिका को (जो मैंने कमांड में निर्दिष्ट किया है)। मुझे यहां क्या समझ नहीं आ रहा है?

संपादित करें:

हां, मुझे लगता है कि 'निकालें-फाइलें' विकल्प काफी शाब्दिक है। हालाँकि मुझे भी उस बिंदु पर मैन पेज अस्पष्ट मिला। (लिनक्स में मैं वास्तव में निर्देशिकाओं और फाइलों के बीच बहुत अंतर नहीं करता हूं, और कभी-कभी भूल जाता हूं कि वे एक ही चीज नहीं हैं)। ऐसा लगता है कि आम सहमति यह है कि यह निर्देशिकाओं को नहीं हटाती है।

हालाँकि, इस प्रश्न को पूछने के लिए मेरा प्रमुख संकेत बिंदु टार के पूर्ण पथ से निपटने से है। क्योंकि आपको संपीड़ित होने के लिए फ़ाइल के लिए एक सापेक्ष पथ निर्दिष्ट करना होगा, इसलिए आपको इसे ठीक से टारगेट करने के लिए मूल निर्देशिका में बदलना होगा। जैसा कि मैं इसे किसी भी तरह के फॉलो-ऑन 'आरएम' कमांड का उपयोग करके देखता हूं, उस स्थिति में संभावित खतरनाक है। इस प्रकार मैं टार खुद को हटाने के द्वारा चीजों को आसान बनाने की उम्मीद कर रहा था।

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


निकोलस, आपकी बात यह है कि यह एक अतिरिक्त कदम में निर्देशिका पेड़ को हटाने के लिए खतरे को जोड़ता है, बिल्कुल वैध है। मुझे लगता है कि यह अभिलेखागार द्वारा सुरक्षित रूप से किया जाना संभव होना चाहिए। मेरा यह भी मानना ​​है कि यह ग्नू टार के रचनाकारों का इरादा था, कम से कम यह होना चाहिए ;-)
मीतू

2
मैंने पाया है कि --remove-files विकल्प वास्तव में युक्त dir को हटाता है - कम से कम कुछ प्लेटफार्मों पर / कुछ संस्करणों में - और मेरे मामले में। हो सकता है कि आपके मामले में कुछ फ़ाइलों के टार होने के बाद संशोधित होने के कारण शेष डायर पूरी तरह से खाली न हो।
.ync

@isync मैं अनुभव कर रहा हूँ - Ubuntu-14.04 पर निर्देशिकाओं को हटाने वाली फाइलें-फाइलें। अपने मामले को छोड़कर मैं इसे नहीं चाहता। हाहा
ब्रैडली ओडेल

जवाबों:


12

आप उस भाग को याद कर रहे हैं जो कहता है कि --remove-filesविकल्प संग्रह में जोड़ने के बाद फ़ाइलों को हटा देता है ।

आप जैसे आदेश के साथ संग्रह और फ़ाइल हटाने के संचालन का पालन कर सकते हैं,

/ पथ / / to / be / archived / -depth -type d -empty -exec rmdir {} \;


अद्यतन: आप इस लघु डेबियन चर्चा को पढ़ने में रुचि रख सकते हैं,
बग 424692: --remove- फाइलों की शिकायत है कि निर्देशिका "जैसे ही हम इसे पढ़ते हैं" बदल जाती है


हो सकता है कि यह वास्तव में हो: अपना काम शुरू करने -cसे पहले डायरेक्टरी बदल जाती है tar(और जब तक काम नहीं हो जाता है) वापस नहीं आती है। मुझे लगता है कि यह उपनिर्देशिकाओं को हटा दिया गया होगा, अगर वे संग्रह में शामिल थे (लेकिन मैंने इसका परीक्षण नहीं किया है)।
अर्जन १

@ अर्जन, मुझे नहीं लगता ' c'इससे कोई लेना-देना है; 'remove-files'जानबूझकर निर्देशिकाएं नहीं निकालता है।
निक

अहा, मुझे उन manपृष्ठों पर बहुत स्पष्ट नहीं होने के कारण संक्षिप्त विवरण "फ़ाइलों को संग्रह में जोड़ने के बाद हटा दें" , लेकिन मुझे लगता है कि आप सही हैं। फिर भी, मुझे उम्मीद नहीं है कि निर्देशिका को हटाने के लिए उल्लेख -cकिया गया है, भले ही tar निर्देशिका को हटा दिया हो । (मुझे करने के लिए, कि वर्तमान निर्देशिका को हटाने की तरह होगा, इसलिए संग्रह सहित ही, जब उपयोग नहीं कर रहा है -c...?) लेकिन अगर -remove-filesहमेशा निर्देशिकाओं को जगह में छोड़ देता है, तो मैं निश्चित रूप से सिर्फ चीजों को जटिल कर रहा हूं। ;-)
अर्जन

3
--remove-filesबग में तय किया गया था tar-1.19
x-yuri

19

चूंकि --remove-filesविकल्प केवल फाइलों को हटा देता है , आप कोशिश कर सकते हैं

tar -cvf files.tar my_directory && rm -R my_directory

ताकि निर्देशिका केवल तभी निकाली जाए जब tarरिटर्न 0 की निकास स्थिति हो


9
सिवाय इसके कि आपको आरएम करने से पहले टार की निकास स्थिति की जांच करनी चाहिए! अन्यथा आप बिना टार संग्रह और कोई फाइल नहीं छोड़ सकते ...
किम

1
एक स्तर की निर्देशिकाओं का उपयोग करते समय, मैं एक सुरक्षित विकल्प को 'rmdir' के बजाय 'rm' के रूप में उपयोग करूंगा क्योंकि यह केवल एक खाली निर्देशिका को हटा देगा। [प्रश्न संपादन देखें]
निकोलस

लेकिन rmdirकेवल खाली निर्देशिकाओं को निकालता है । यह विचार था कि निर्देशिका और उसमें मौजूद फाइलों को हटा दिया जाए (बशर्ते tarसफल हो)
pavium

--remove-filesबग में तय किया गया था tar-1.19
x-yuri

&& केवल निम्न कमांड को चलाएगा, यदि पिछली कमांड 0 (सफलता) से बाहर हो जाए। यदि यह 0 से बाहर निकलता है, तो निम्न आदेश नहीं चलाया जाएगा। आप इसके साथ उल्टा भी कर सकते हैं || - केवल तभी चलाएं जब पहला कमांड विफल हो गया हो। भयावह सामग्री की जाँच करने का अच्छा तरीका यह है कि एक को पुनः आरंभ करें।
सिरस

6

क्या आपने संग्रह नाम के बाद --remove-files निर्देश डालने की कोशिश की है? इससे मेरा काम बनता है।

tar -cvf files.tar --remove-files my_directory

1
यह अधिक संभावना है कि इस प्रश्न के सामने आने के बाद से टार का व्यवहार बदल गया है। मेरे लिए, --remove-filesपहले या बाद में डालने में कोई अंतर नहीं है my_directory; दोनों मामलों में, निर्देशिका को हटा दिया गया है।
Redburn

5
--remove-filesबग में तय किया गया था tar-1.19
x-yuri

1
source={directory argument}

जैसे

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

जैसे

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

तब आप कुछ चीजों को अंजाम दे सकते हैं:

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [ $? != 0 ]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi

1

यह शायद एक बग था।

साथ ही इस मामले में "फ़ाइल" शब्द अस्पष्ट है। लेकिन क्योंकि यह एक कमांड लाइन स्विच है, तो मैं इसका मतलब निर्देशिकाओं से भी उम्मीद करूंगा, क्योंकि यूनिक्स / lnux में सब कुछ एक फाइल है, एक निर्देशिका भी है। (अन्य व्याख्या भी निश्चित रूप से मान्य है, लेकिन इस तरह के मामले में निर्देशिकाओं को रखने का कोई मतलब नहीं है। मैं इसे अप्रत्याशित और भ्रमित व्यवहार मानूंगा।)

लेकिन मैंने पाया है कि कुछ वितरणों पर गन्न टार में ग्नू टार वास्तव में डायरेक्टरी ट्री को हटा देता है। एक और संकेत है कि पेड़ को रखना बग था। या जब तक उन्होंने इसे ठीक नहीं किया कम से कम कुछ समाधान।

यह वही है जो मैंने एक ubuntu 10.04 कंसोल पर आज़माया है:

mit: / var / tmp $ mkdir tree1                                                                                               
mit: / var / tmp $ mkdir tree1 / sub1                                                                                          
mit: / var / tmp $> tree1 / sub1 / file1                                                                                        

mit: / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 रूट रूट 4096 2011-11-14 15:40।                                                                              
drwxr-xr-x 16 रूट रूट 4096 2011-02-25 03:15 ।।
drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 पेड़ 1

mit: / var / tmp $ tar -czf tree1.tar.gz tree1 / --remove-files

# जैसा कि आप देख सकते हैं कि अब क्या हुआ है:

mit: / var / tmp $ ls -la
drwxrwxrwt 3 रूट रूट 4096 2011-11-14 15:41।
drwxr-xr-x 16 रूट रूट 4096 2011-02-25 03:15 ।।
-rw-r - r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz                                                                   


mit: / var / tmp $ tar --version                                                                                             
टार (GNU टार) 1.22                                                                                                           
कॉपीराइट © 2009 फ्री सॉफ्टवेयर फाउंडेशन, इंक।

यदि आप इसे अपनी मशीन पर देखना चाहते हैं, तो इसे अपने जोखिम पर कंसोल में चिपकाएँ:

टार --version                                                                                             
सीडी / var / tmp
mkdir- पी ट्री 1 / सब 1                                                                                          
> ट्री 1 / सब 1 / फाइल 1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -ला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.