Soru Bir UNIX dosya sisteminde JAR'ı tek bir komutla nasıl ayıklarsınız ve JAR komutunu kullanarak hedef dizinini nasıl belirlersiniz?


UNIX sistem komutlarını çalıştırdığım bir Python betiği oluşturuyorum. Benim bir Portal.ear adlı bir kulak arşivindeki Binaries.war adlı savaş arşivi

Portal kulak dosyası, / home / foo / bar / ifadesinde bulunur.

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

Komut dosyasını çalıştırdığım geçerli dizinin içine /home/foo/bar/Portal.ear arşivinden Binaries.war dosyasını ayıklayacağım.

Tek bir komut kullanarak ayıklanacak bir hedef dizini nasıl belirlersiniz? Ben / home / foo / bar / baz dizinine Binaries.war ayıklamak için böyle bir şey yapmak istiyorum

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

Seçenekler için JAR man sayfasını aradım ve bunu yapmanın basit bir yolunu bulamıyorum. Elbette arşivi şu anki dizine aktarabilirim ve daha sonra mv kullanarak taşıyabilirim fakat bunu tek bir çekimde yapmak ve dizinleri ve dosyaları karıştırmamak istiyorum.


44
2017-07-03 14:50


Menşei




Cevaplar:


Kavanoz dosyanız zaten gösterildiği gibi mutlak bir yol adına sahipse, özellikle kolaydır:

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

Yani, sizin için Python değişim dizini tarafından yürütülen kabuk var ve sonra ayıklama çalıştırın.

Kavanoz dosyanızda mutlak bir yol adı yoksa, göreceli ismi mutlak olarak (geçerli dizinin yolu ile önekleyerek) dönüştürmeniz gerekir. jar dizin değiştirildikten sonra bulabilirsiniz.

Endişelenmek için bırakılan tek sorun, yol adlarındaki boşluklar gibi şeyler.


59
2017-07-03 15:12



Bunu yapmanın yolu budur. Varsa, önce dizini de oluşturabilirsiniz. - nos
'Cd' komutundan önce "mkdir -p / where / you / want / it" komutunu çalıştırın - evet, kesinlikle bunu yapabilirdiniz. - Jonathan Leffler
Herhangi biriniz söz konusu olduğunda, bu jar xfyöntem orijinal kavanoz bozulmamış bırakır. - Cale Sweeney


Kavanoz aracının bunu yerel olarak desteklemediğini sanmıyorum, ancak "unzip" ile bir JAR dosyasını açabilir ve "-d" seçeneğiyle çıktı dizinini belirtebilirsiniz.

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

57
2017-07-03 14:56



Evet - kavanozlar sadece farklı bir uzantıya sahip. "Kavanoz" araçları eksik olduğunda, güneş altında hemen hemen her şeyi yapabileceğiniz fermuarlarla uğraşan birçok araç var (ha ha kötü pun) - zenazn
Bu işe yarayacak, ancak Portal.ear dosyası çok büyük ve çok uzun sürecek. Sadece Portal.ear'dan Binaries.war arşivini çıkarmak istiyorum. Bunu unzip kullanarak yapmanın bir yolu olmalı. - Christopher Tokar
$ adam unzip! Ben sadece Binaries.war dosyasını dahil etmek için soruyu değiştirdim - tddmonkey
Bu şekilde gördüğümden daha basit olduğunu doğrularım. Gerçekten de, kavanoz bir çeşit başarı dosyasıdır. - Tung


Python betiği içindeki çalışma dizinini değiştiremez misiniz os.chdir(target)? Katılıyorum, bunu jar komutunun kendisinden yapmanın hiçbir yolunu göremiyorum.

Dizini kalıcı olarak değiştirmek istemiyorsanız, geçerli dizini ( os.getcwd()) bir değişkendedir ve daha sonra değişmektedir.


1
2017-07-03 14:57





Bu kişisel bir komut dosyasıysa, dağıtmayı planladığınızdan ziyade, bunun için bir kabuk işlevi yazmak daha basit olabilir:

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

Daha sonra python'dan böyle bir şey diyebilirsiniz:

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

Eğer gerçekten böyle hissediyorsan, dosya adını yolundan ayırmak için sed kullanabilirsin, böylece onu arayabilirsin.

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

Yine de bunu okuyucuya bir alıştırma olarak bırakacağım.

Tabii ki, bu, .war'i önce geçerli dizine çıkaracak ve sonra onu taşıyacağından, aynı adla bir şeyin üzerine yazılma olasılığınız vardır.

Dizini değiştirme, ayıklama ve geri alma işlemi biraz daha temizdir, ancak kod dağınıklığını azaltmak istediğimde her zaman böyle küçük bir satır kabuk işlevleri kullanıyorum.


1
2017-07-13 20:39



Bu işlev önce geçerli dizin ve sonra hamle hedefe Yani sadece bir dizinde yazarken izin yazabilirsiniz, bu bir izin aşağı. Anlatmanın bir yolu var mı jar doğrudan hedefe ulaşmak için? - MestreLion
jar  meli destek -C ayıklama (dizin değiştirme) seçeneği, ancak benim makinemde (hangi garip buluyorum). Bundan dolayı, muhtemelen bugünkü işlevi daha fazla bir şeye yeniden yazabilirim. function warextract { pushd "$3" && jar xf "$1" "$2" ; popd }. Ve ekle --help dokümantasyon. :) - Xiong Chiamiov
Ayrıca, basename ve dirname dizin / dosya bölmeleri yapmaktan çok daha iyi seçenekler sed. Dört yılda öğrendiğin şeyler. - Xiong Chiamiov
Bash, bu işlevi (bunun yerine parantezi dikkat) yazmak zorundaydık: function warextract () {jar xf $ 1 $ 2 && mv $ 2 $ 3} - Carlos
Malısın asla ikisini de kullanmayın function ve (); sadece parens en güvenli seçimdir. - Xiong Chiamiov