2009-07-03 9 views
44

Sto creando uno script Python all'interno del quale sto eseguendo comandi di sistema UNIX. Ho un archivio guerra di nome Binaries.war che è all'interno di un archivio di nome orecchio Portal.earCome si estrae un JAR in un filesystem UNIX con un singolo comando e si specifica la sua directory di destinazione usando il comando JAR?

Il file ear Portal risiede, per esempio/home/foo/bar/

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

estrarrà i binari .war file dall'archivio /home/foo/bar/Portal.ear nella directory corrente di cui sto eseguendo lo script.

Come si specifica una directory di destinazione da estrarre utilizzando un solo comando? Vorrei fare qualcosa di simile per estrarre Binaries.war nella directory/home/foo/bar/baz

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

ho cercato la pagina man JAR per le opzioni e non riesco a trovare una semplice modo per farlo. Ovviamente posso estrarre l'archivio nella mia attuale directory e quindi spostarlo usando mv ma mi piacerebbe farlo in un colpo solo e non mescolare directory e file in giro.

risposta

57

Se il file jar ha già un percorso assoluto come mostrato, è particolarmente facile:

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

Cioè, avete la shell eseguito da cambiare la directory Python per voi e quindi eseguire l'estrazione.

Se il file jar non ha già un percorso assoluto, è necessario convertire il nome relativo in assoluto (con il prefisso del percorso della directory corrente) in modo che jar possa trovarlo dopo il cambio di directory.

Gli unici problemi di cui preoccuparsi sono cose come spazi vuoti nei nomi dei percorsi.

+1

Questo è il modo per farlo. Si potrebbe anche creare la directory prima se non esiste. – nos

+1

Esegui "mkdir -p/where/you/want/it" prima del comando "cd" - sì, certamente potresti farlo. –

+0

Nel caso qualcuno di voi sia interessato, questo metodo 'jar xf' lascia intatto il vaso originale. –

56

Non credo che lo strumento barattolo supporta in modo nativo, ma è possibile basta decomprimere un file JAR con "decomprimere" e specificare la directory di output con quello con l'opzione "-d", in modo da qualcosa come:

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

Sì. I vasi sono solo. Zip con un'estensione diversa. Quando mancano gli strumenti "jar", ci sono molti strumenti che trattano le cerniere che possono fare qualsiasi cosa sotto il sole (ha ha un cattivo gioco di parole) – zenazn

+0

Funzionerebbe, ma il file Portal.ear è enorme e richiederebbe troppo tempo . Voglio solo estrarre l'archivio Binaries.war da Portal.ear. Ci deve essere un modo per farlo usando unzip. –

+0

$ man decomprimere !! Ho modificato la domanda per includere solo il file Binaries.war – tddmonkey

1

Non puoi semplicemente cambiare la directory di lavoro all'interno dello script python usando os.chdir(target)? Sono d'accordo, non riesco a vedere alcun modo di farlo dal comando jar stesso.

Se non si desidera modificare la directory in modo permanente, memorizzare la directory corrente (utilizzando os.getcwd()) in una variabile e tornare in seguito.

1

Se si tratta di uno script personale, piuttosto che uno avete in programma di distribuzione, potrebbe essere più semplice scrivere una funzione di shell per questo:

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

che si potrebbe quindi chiamare in pitone in questo modo:

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

Se davvero voglia, si potrebbe usare sed per analizzare fuori il nome del file dal percorso, in modo che si sarebbe in grado di chiamare con

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

Lo lascio come esercizio al lettore, però.

Naturalmente, poiché questo estrae il file .war nella directory corrente per primo, quindi lo sposta, ha la possibilità di sovrascrivere qualcosa con lo stesso nome in cui ci si trova.

Cambiare directory, estraerlo e tornare indietro è un po 'più pulito, ma mi trovo a utilizzare piccole funzioni di shell su una sola riga come questa per tutto il tempo in cui voglio ridurre l'ingombro del codice.

+0

Questa funzione estrae prima * la directory corrente * e quindi * si sposta * alla destinazione. Quindi si può usare solo mentre in una directory si hanno i permessi di scrittura, che è una delusione. C'è un modo per dire 'jar' per estrarre direttamente alla destinazione? – MestreLion

+0

'jar' * dovrebbe * supportare l'opzione' -C' (cambia directory) all'estrazione, ma non sulla mia macchina (che trovo strano). A causa di ciò, probabilmente riscriverei la funzione oggi a qualcosa di più simile a function warextract {pushd "$ 3" && jar xf "$ 1" "$ 2"; popd} '. Bene, e aggiungi la documentazione di '--help'. :) –

+0

Inoltre, 'basename' e' dirname' sono opzioni molto migliori per fare divisioni directory/file di 'sed'. Le cose che impari in quattro anni. –

Problemi correlati