¿Cómo se extrae un JAR en un sistema de archivos UNIX con un solo comando y se especifica su directorio de destino con el comando JAR?

Estoy creando un script de Python en el que estoy ejecutando comandos del sistema UNIX. Tengo un archivo de guerra llamado Binaries.war que está dentro de un archivo ear llamado Portal.ear

El archivo de la oreja del Portal reside en, por ejemplo, / home / foo / bar /

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

Extraerá el archivo Binaries.war del archivo /home/foo/bar/Portal.ear en el directorio actual desde el que estoy ejecutando el script.

¿Cómo especifica un directorio de destino para ser extraído usando solo un comando? Me gustaría hacer algo como esto para extraer Binaries.war en el directorio / home / foo / bar / baz

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

Busqué opciones en la página del manual de JAR y parece que no puedo encontrar una forma sencilla de hacerlo. Por supuesto, puedo extraer el archivo en mi directorio actual y luego moverlo usando mv, pero me gustaría hacer esto de una sola vez y no mezclar directorios y archivos.

Si su archivo jar ya tiene una ruta de acceso absoluta como se muestra, es particularmente fácil:

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

Es decir, tiene el shell ejecutado por el directorio de cambios de Python para usted y luego ejecuta la extracción.

Si su archivo jar aún no tiene una ruta de acceso absoluta, entonces debe convertir el nombre relativo en absoluto (prefijándolo con la ruta del directorio actual) para que jar pueda encontrarlo después del cambio de directorio.

Los únicos problemas que quedan por preocuparse son cosas como espacios en blanco en los nombres de ruta.

No creo que la herramienta jar admita esto de forma nativa, pero puedes descomprimir un archivo JAR con “descomprimir” y especificar el directorio de salida con la opción “-d”, así que algo como:

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

¿No puedes simplemente cambiar el directorio de trabajo dentro del script python usando os.chdir(target) ? Estoy de acuerdo, no puedo ver ninguna forma de hacerlo desde el propio comando jar.

Si no desea cambiar permanentemente el directorio, entonces almacene el directorio actual (usando os.getcwd() ) en una variable y luego vuelva a cambiar.

Si este es un script personal, en lugar de uno que planeas distribuir, podría ser más sencillo escribir una función de shell para esto:

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

que luego podrías llamar desde python así:

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

Si realmente te apetece, puedes usar sed para analizar el nombre de archivo de la ruta, de modo que puedas llamarlo

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

Sin embargo, dejaré eso como un ejercicio para el lector.

Por supuesto, ya que esto extraerá primero la .war en el directorio actual, y luego lo moverá, tiene la posibilidad de sobrescribir algo con el mismo nombre donde se encuentra.

Cambiar el directorio, extraerlo y devolver el CD es un poco más limpio, pero me encuentro usando pequeñas funciones de shell de una línea como esta todo el tiempo cuando quiero reducir el desorden de códigos.