सवाल आप एक एकल आदेश के साथ एक यूनिक्स फाइल सिस्टम में एक JAR कैसे निकालते हैं और JAR कमांड का उपयोग करके अपनी लक्ष्य निर्देशिका निर्दिष्ट करते हैं?


मैं एक पायथन लिपि बना रहा हूं जिसमें मैं यूनिक्स सिस्टम कमांड निष्पादित कर रहा हूं। मेरे पास एक युद्ध संग्रह संग्रह Binaries.war जो पोर्टल.यर नामक एक कान संग्रह के भीतर है

पोर्टल कान फ़ाइल में रहता है, कहें / home / foo / bar /

jar xf /home/foo/bar/Portal.ear Binaries.war

वर्तमान निर्देशिका में /home/foo/bar/Portal.ear संग्रह से Binaries.war फ़ाइल निकालेंगे, मैं स्क्रिप्ट चला रहा हूं।

आप केवल एक कमांड का उपयोग करने के लिए निकालने के लिए लक्षित निर्देशिका निर्दिष्ट कैसे करते हैं? मैं निर्देशिका / घर / foo / bar / baz में binaries.war निकालने के लिए ऐसा कुछ करना चाहता हूं

jar xf /home/foo/bar/Portal.ear Binaries.war [into target directory /home/foo/bar/baz]

मैंने विकल्पों के लिए जार मैन पेज की खोज की और ऐसा करने का एक आसान तरीका प्रतीत नहीं होता है। बेशक मैं संग्रह को अपनी वर्तमान निर्देशिका में निकाल सकता हूं और फिर इसे एमवी का उपयोग करके ले जा सकता हूं लेकिन मैं इसे एक शॉट में करना चाहता हूं और निर्देशिकाओं और फ़ाइलों को चारों ओर घुमा नहीं सकता।


44
2017-07-03 14:50


मूल




जवाब:


यदि आपके जार फ़ाइल में पहले से ही एक पूर्ण पथनाम दिखाया गया है, तो यह विशेष रूप से आसान है:

cd /where/you/want/it; jar xf /path/to/jarfile.jar

यही है, आपके पास पाइथन परिवर्तन निर्देशिका द्वारा आपके द्वारा निष्पादित खोल है और फिर निष्कर्षण चलाएं।

यदि आपकी जार फ़ाइल में पहले से ही पूर्ण पथनाम नहीं है, तो आपको रिश्तेदार नाम को पूर्ण रूप से परिवर्तित करना होगा (वर्तमान निर्देशिका के पथ के साथ इसे उपसर्ग करके) ताकि jar निर्देशिका के परिवर्तन के बाद इसे पा सकते हैं।

चिंता करने के लिए छोड़े गए एकमात्र मुद्दे पथ नामों में रिक्त स्थान जैसी चीजें हैं।


59
2017-07-03 15:12



यह करने का यह तरीका है। यदि आप मौजूद नहीं हैं तो आप पहले निर्देशिका भी बना सकते हैं। - nos
'Cd' कमांड से पहले "mkdir -p / where / you / want / it" चलाएं - हाँ, निश्चित रूप से आप ऐसा कर सकते हैं। - Jonathan Leffler
यदि आप में से कोई भी चिंतित है, तो यह jar xfविधि मूल जार बरकरार छोड़ देता है। - Cale Sweeney


मुझे नहीं लगता कि जार टूल इस मूल रूप से समर्थन करता है, लेकिन आप "अनजिप" के साथ एक JAR फ़ाइल को अनजिप कर सकते हैं और "-d" विकल्प के साथ आउटपुट निर्देशिका निर्दिष्ट कर सकते हैं, इसलिए कुछ ऐसा है:

$ unzip -d /home/foo/bar/baz /home/foo/bar/Portal.ear Binaries.war

57
2017-07-03 14:56



हाँ - जार एक अलग एक्सटेंशन के साथ बस .zips हैं। जब "जार" उपकरण की कमी होती है, तो ऐसे बहुत सारे उपकरण होते हैं जो ज़िप के साथ सौदा करते हैं जो सूर्य के नीचे कुछ भी कर सकते हैं (हा हा बुरा पून) - zenazn
यह काम करेगा, लेकिन पोर्टल.यर फ़ाइल बहुत बड़ी है और इसमें बहुत अधिक समय लगेगा। मैं सिर्फ पोर्टल.यर से Binaries.war संग्रह निकालना चाहता हूँ। अनजिप का उपयोग करके ऐसा करने का एक तरीका होना चाहिए। - Christopher Tokar
$ आदमी unzip !! मैंने केवल Binaries.war फ़ाइल को शामिल करने के लिए प्रश्न में संशोधन किया है - tddmonkey
मैं पुष्टि करता हूं कि इस तरह से मैंने कभी देखा है उससे आसान है। वास्तव में, जार एक प्रकार की उपलब्धि फ़ाइल है। - Tung


क्या आप सिर्फ पाइथन लिपि के भीतर काम कर रहे निर्देशिका को बदल नहीं सकते हैं os.chdir(target)? मैं सहमत हूं, मैं इसे जार कमांड से करने का कोई तरीका नहीं देख सकता।

यदि आप निर्देशिका को स्थायी रूप से बदलना नहीं चाहते हैं, तो वर्तमान निर्देशिका को स्टोर करें (का उपयोग कर os.getcwd()) एक चर में और बाद में बदल जाते हैं।


1
2017-07-03 14:57





यदि यह एक व्यक्तिगत स्क्रिप्ट है, तो आप जिस पर वितरण करने की योजना बना रहे हैं, उसके बजाय एक शैल फ़ंक्शन लिखना आसान हो सकता है:

function warextract { jar xf $1 $2 && mv $2 $3 }

जिसे आप पाइथन से कॉल कर सकते हैं:

warextract /home/foo/bar/Portal.ear Binaries.war /home/foo/bar/baz/

यदि आप वास्तव में ऐसा महसूस करते हैं, तो आप मार्ग से फ़ाइल नाम को पार्स करने के लिए sed का उपयोग कर सकते हैं, ताकि आप इसे कॉल कर सकें

warextract /home/foo/bar/Portal.ear /home/foo/bar/baz/Binaries.war

मैं इसे पाठक को एक अभ्यास के रूप में छोड़ दूंगा, हालांकि।

बेशक, चूंकि यह पहले निर्देशिका में .war बाहर निकालेगा, और फिर इसे स्थानांतरित करेगा, इसलिए आपके पास उसी नाम से कुछ ओवरराइट करने की संभावना है जहां आप हैं।

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


1
2017-07-13 20:39



यह कार्य पहले निष्कर्ष निकाला जाता है वर्तमान निर्देशिका और फिर यह चाल गंतव्य के लिए। तो कोई भी उस निर्देशिका में उपयोग कर सकता है जब आपके पास लिखने की अनुमति है, जो एक लेट डाउन है। बताने का कोई तरीका है jar सीधे गंतव्य तक निकालने के लिए? - MestreLion
jar  चाहिए का समर्थन -C (निर्देशिका बदलें) निष्कर्षण पर विकल्प, लेकिन यह मेरी मशीन पर नहीं है (जो मुझे अजीब लगता है)। इसके कारण, मैं शायद इस समारोह को आज कुछ और लिखने के लिए फिर से लिखूंगा function warextract { pushd "$3" && jar xf "$1" "$2" ; popd }। अच्छा, और जोड़ें --help प्रलेखन। :) - Xiong Chiamiov
इसके अलावा, basename तथा dirname निर्देशिका / फ़ाइल विभाजन के मुकाबले ज्यादा बेहतर विकल्प हैं sed। चीजें जो आप चार साल में सीखते हैं। - Xiong Chiamiov
बैश में, मुझे इस फ़ंक्शन को लिखना था (इसके बारे में कोष्ठक नोटिस) इसके बजाए: फ़ंक्शन वेयरक्स्ट्रैक्ट () {jar xf $ 1 $ 2 && mv $ 2 $ 3} - Carlos
तुम्हे करना चाहिए दोनों का कभी भी उपयोग न करें function तथा (); सिर्फ माता-पिता सबसे सुरक्षित विकल्प हैं। - Xiong Chiamiov