Extraiga el archivo del directorio dentro del archivo tar sin crear ese directorio

Extraiga el archivo del directorio dentro del archivo tar sin crear ese directorio

Tengo un archivo tar que tiene la siguiente estructura:

- dir1
 -- file
- dir2
- dir3

Si intento ejecutar tar -xf tarfile.tar.gz dir1/file, se creará el directorio 1 que contiene el archivo. En cambio, me gustaría obtener el archivo sin el directorio intermedio. Podría mover el archivo y eliminar el directorio, pero me preguntaba si el comando tar ofrece soporte para hacerlo directamente.

Estoy usando Alpine Linux.

Respuesta1

POSIXly (excepto la gunzipparte que no es un comando POSIX):

gunzip < file.tar.gz | pax -rs'|.*/||' dir1/file1

Con bsdtar:

tar -s'|.*/||' -xf file.tar.gz dir1/file1

Con GNU tar:

tar --transform='s|.*/||' -xf file.tar.gz dir1/file1

Con star:

star -s '|*/||' -x -f file.tar.gz dir1/file1

Tenga en cuenta que para algunos de ellos, si el archivo es un enlace simbólico, la sustitución también afectará al destino del enlace simbólico.

Respuesta2

Puede extraerlo a la salida estándar (-O) y canalizarlo al nombre de archivo deseado.

Respuesta3

Aquí está mi solución en Ruby. No intento manejar los enlaces simbólicos correctamente, pero, por supuesto, eso podría agregarse.

outfiles = `tar zxvf #{ARGV[0]}`
root_dirs = {}
outfiles.each_line do |l|
  s = l.split('/')
  root_dirs[s[0]] = 1
  `mv #{l.chomp} ./#{s[-1]}`
end
root_dirs.each_key {|rd| `rm -rf #{rd}`}

información relacionada