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 gunzip
parte 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}`}