Extraer un único archivo de un ZIP

Hoy una entrada rápida con un pequeño «truco» para extraer únicamente un archivo de un ZIP que contiene varios directorios y archivos. En primer lugar visualizamos el contenido del zip:

$ unzip -l test.zip 
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2016-06-05 21:41   test/
        0  2016-06-05 21:41   test/foo/
        0  2016-06-05 21:41   test/foo/bar/
        0  2016-06-05 21:41   test/foo/bar/test3.txt
        0  2016-06-05 21:41   test/foo/bar/test2.txt
        0  2016-06-05 21:41   test/foo/bar/test1.txt
---------                     -------
        0                     6 files

Una vez localizado el archivo, simplemente pasamos como parámetro la ruta interna del archivo dentro del zip y después la ruta en la que lo queremos desempaquetar:

$ unzip -j test.zip "test/foo/bar/test2.txt" -d .
Archive:  test.zip
 extracting: ./test2.txt    

Si no queremos crear la estructura de directorios sino únicamente extraer el archivo utilizamos -j, si quitamos este parámetro se crearán los directorios «test/foo/bar» a partir de la ruta que indiquemos:

$ unzip  test.zip "test/foo/bar/test2.txt" -d .
Archive:  test.zip
 extracting: ./test/foo/bar/test2.txt  
$ pwd
/tmp
$ ls -l /tmp/test/foo/bar/test2.txt 
-rw-rw-r-- 1 foo foo 0 Jun  5 21:41 /tmp/test/foo/bar/test2.txt