linux tar -T - मक्खी पर काम नहीं करता है


3

मुझे linux gnu tar से कुछ समस्या मिली। जब मैं विकल्प का उपयोग करता हूं

-T -  (for file list from stdin) or
-T named_pipe_file    ,

यह मक्खी पर काम नहीं करता है। उदाहरण के लिए, सरल इंटरैक्टिव स्क्रिप्ट:

while read x; do echo $x; done|\
tar cvf tar.tar -T -

टार केवल तभी शुरू होता है जब मैं इनपुट EOF को चिह्नित करने के लिए ^ D दबाता हूं यही स्थिति तब है जब मैं नामित पाइप का उपयोग करता हूं:

mkfifo named_pipe
tar cvf tar.tar -T named_pipe
while read x; do echo $x; done >named_pipe

लगता है टार कुछ बफ़रिंग बनाता है। लेकिन यह कब तक है? मुझे TAR में बहुत सारी फ़ाइलों को वापस करना होगा लेकिन डिस्क स्थान बहुत कम है। फिर मुझे उड़ने पर ऐसा करना चाहिए। मैं इसके लिए टार ऑप्शन --remove-files का उपयोग नहीं करता। लेकिन -T विकल्प के लिए अन्तरक्रियाशीलता के बिना यह असंभव है। योजना में, "जबकि" कोड का हिस्सा क्रमिक रूप से फ़ाइल करने के लिए अनपैक करना चाहिए और हटाने के लिए TAR की प्रतीक्षा करनी चाहिए, और अगली फ़ाइल। विचारों के लिए धन्यवाद :)

मेरा टार संस्करण: टार (जीएनयू टार) १.२६ (सी) २०११ एफएसएफ


क्या आप खिला रहे हैं? tar फ़ाइल नाम या वास्तविक डेटा जो इसे संपीड़ित करना चाहिए? -T विकल्प फ़ाइल नामों की एक सूची की उम्मीद करता है और मेरे सिस्टम पर एक लूप में विज्ञापित के रूप में काम करता है।
terdon

जवाबों:


3

tar पहले से ही मौजूद अभिलेखागार को जोड़ने में सक्षम है, इसलिए आप ऐसा कर सकते हैं:

touch tarfile.tar
command_that_produces_file_list | xargs tar rf tarfile.tar

दुर्भाग्य से, यह मक्खी संपीड़न पर काम नहीं करता है। सौभाग्य से, tar प्रारूप काफी सरल है हम कुछ हैकिंग कर सकते हैं:

command_that_produces_file_list | {
  xargs -i sh -c 'tar c {} | head -c $(( (`stat --printf="%s" {}` + 511) / 512 * 512 + 512))';
  dd if=/dev/zero bs=512 count=2 2>/dev/null;
} | compression_utility

tar आउटपुट में प्रत्येक फ़ाइल के लिए, 512-बाइट हेडर होता है जिसके बाद फ़ाइल डेटा को रखने के लिए पर्याप्त 512-बाइट ब्लॉक होते हैं। यह शून्य के कम से कम 2 512-बाइट ब्लॉक को जोड़ता है। यह कोड क्या करता है, टार के आउटपुट को कैप्चर करता है और शून्य के अतिरिक्त ब्लॉक्स को हटाता है, आउटपुट को कई इनोकेशन से संयोजित करता है tar साथ में, और फिर शून्य के समापन ब्लॉकों पर चिपक जाता है। आउटपुट को पाइप को संपीड़न उपयोगिता में भेजा जाता है, जो समवर्ती रूप से चलता है tar रों।


मुझे इस बारे में पता है। यह केवल संग्रह के लिए असम्पीडित या टेप के लिए हो सकता है जिसमें हार्डवेअर कम्प्रेशन सॉफ्टवेयर के संपर्क में न आए उस टेप को असम्पीडित सॉफ्टवेयर के रूप में दिखाया गया है। मैंने उदाहरण दिया जितना आसान हो सकता है। स्क्रिप्ट में मैं झंडे के साथ xz संपीड़न का उपयोग कर रहा हूँ -9ev और टार के लिए -remove-files।
Znik

आप जगह में फ़ाइलों को संपीड़ित करने की कोशिश कर सकते हैं और फिर उन्हें एक सादे टार में संग्रहीत कर सकते हैं, अन्यथा मुझे एक समाधान मिलेगा जो टार का उपयोग नहीं करता है। इसके लिए आपको क्या करने की आवश्यकता है?
wingedsubmariner

@ user215501 यह पता चला है कि टार के साथ ऐसा करने का एक तरीका है, मेरे नए संपादित जवाब देखें।
wingedsubmariner

@ingedsubmariner, और (at) user215501 बहुत अच्छा अपडेट टार हैक फॉर्मेट के साथ :) मुझे आशा है कि यह बग टार में (मेरी राय में) जल्द ही हटा दिया जाएगा। मुझे यकीन नहीं है कि हम में से कौन इस मुश्किल स्क्रिप्ट को करता है
Znik

@wingedsubmariner आप से नफरत है, सर! :)
Ярослав Рахматуллин

2

खुशखबरी। मुझे अपनी बग रिपोर्ट के लिए bug-tar@gnu.org पर उत्तर मिलता है, उद्धृत करें

से: सर्गेई पॉज़्नानॉफ़ तारीख:
थू, 05 सितंबर 2013 08:40:40 +0300 विषय: रे: [बग-टार] गन्नू   टार, स्टड या नामित पाइप से विकल्प -T संवादात्मक नहीं है

हाय ग्रेगोरेज़,

यह git HEAD (कमेटी 1fe0c83d से शुरू) में तय किया गया है।

सादर, सर्गेई

तब मैं इंतजार कर रहा हूं जब यह लिनक्स डिस्ट्रोस में तय हो जाएगा :)


0

यह स्पष्टीकरण पढ़ें (पहला उत्तर): पाइप्ड कमांड किस क्रम में चलते हैं?

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

मैं केवल अनुमान लगा सकता हूं कि कमांड लाइन के तर्कों को संभालने की "आंतरिक प्रक्रियाओं" में जटिलता से बचने के लिए पूरी सूची की प्रतीक्षा की जा रही है - जैसे कैसे संभालें "--append और --remove-files"। मुझे लगता है कि ज्यादातर लोग थोक में सभी फ़ाइलों को निकालना पसंद करेंगे बाद संग्रह किया जाता है, और इस मामले में वांछनीय के रूप में मक्खी पर नहीं।

जीएनयू लोग आमतौर पर बहुत ही अनुकूल होते हैं, आप पूछ सकते हैं कि यह एक विशेषता क्यों नहीं है, आप इसे अन्य उपकरणों के साथ कैसे कर सकते हैं और यहां तक ​​कि भविष्य में टार का हिस्सा बनने के लिए भी अनुरोध कर सकते हैं;

https://lists.gnu.org/mailman/listinfo/help-tar


दुर्भाग्य से इसका जवाब नहीं है। आप कमांड द्वारा मेरे उदाहरण में "टार" भाग को प्रतिस्थापित कर सकते हैं। sed 's / aa / bb /' या नामित पाइप sed 's / aa / bb /' & lt; name_pipe (सत्यापन के लिए) के लिए। यह पूरी तरह से काम करता है। यदि आप कीबोर्ड स्ट्रिंग द्वारा डालते हैं और 'आ' वाक्यांश को तुरंत बदल दिया जाता है यदि यह मिल जाए, और स्क्रीन पर वापस प्रिंट करें। पाइप के साथ सब सही है। टार कमांड मुख्य समस्या है।
Znik

यही मैंने कहा, और उपयोगकर्ता 215501 ने मेरे सुझाव का पालन किया (मुझे लगता है) परिणामस्वरूप सुखद खबर मिली;)
Ярослав Рахматуллин

ग्नू लोग वास्तव में अनुकूल हैं :) लेकिन टार के बारे में। यह स्रोत फ़ाइलों को तुरंत हटाने की क्षमता रखता है। यह अस्थायी मुक्त स्थान बचाने के लिए किया जाता है, जो मनुष्य में उतरता है। दूसरे पक्ष में, टार आर्काइव की फाइलों में वही क्रम है जैसे STDIN फॉर-टी - विकल्प द्वारा दिया गया है। वास्तविकता में टार कुछ बफ़रिंग निकालते हैं। यह वर्तमान संग्रहीत / किए गए फ़ाइल को नहीं हटाता है, लेकिन पिछले एक को। यह डेटा हानि के लिए रोकथाम है, इस कार्य को आवंटित नहीं करता है। जब आप उच्च बफरिंग और उच्च शब्दकोश के साथ मजबूत संपीड़न एल्गोरिथ्म का उपयोग करते हैं, तो यह बड़ा मौका है कि यह किसी भी फ़ाइल में सहेजे गए डेटा नहीं है, लेकिन अभी भी स्मृति में रख रहा है।
Znik
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.