Respuestas:
Esto debería funcionar:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
cambia al directorio especificado antes de desempaquetar (o empacar). --strip-components
elimina el número especificado de directorios de los nombres de archivo almacenados en el archivo.
Tenga en cuenta que esto no es realmente portátil. El alquitrán GNU y al menos algunos de los alquitranes BSD tienen la --strip-components
opción, pero no parece existir en otras plataformas similares a Unix.
Sin embargo, la forma tonta de hacerlo funcionaría prácticamente en todas partes.
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
directorio. Por cierto, la belleza está en el ojo del espectador.
Con GNU tar ≥1.16, use --transform
para aplicar una transformación sed regexp a cada nombre de archivo (la transformación se aplica en la ruta completa en el archivo):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Si ugly_name
es el componente de nivel superior de todos los nombres de archivo en el archivo, no necesita molestarse con una coincidencia precisa:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Si no conoce el nombre del directorio de nivel superior, aún puede usar este método, aunque puede preferirlo --strip-components
.
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
Con pax
la utilidad de archivo POSIX, use la -s
opción, que toma una expresión de reemplazo similar a sed como argumento.
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
Utilizar este :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
operador de lista entre esos dos comandos, de modo que el segundo se ejecute solo si el primero tuvo éxito.
ugly_name
ya existe un directorio .
La manera más simple
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
sin --strip-components 1
. (2) Por el contrario, la respuesta aceptada (publicada por Mat) presenta --strip-components 1
sin --one-top-level=pretty_name
. (3) ¿Puede explicar por qué su respuesta, combinando estas opciones, es mejor que cualquiera de las anteriores? Por favor no responda en los comentarios; edite su respuesta para que sea más clara y completa.
--strip-component 1
Se requiere @ G-Man , ya sea con el método mkdir
o --strip-components 1
, de lo contrario, solo obtendrá pretty_name/ugly_name/
.
Desde askUbuntu, esta respuesta funcionó para mí:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--un nivel superior [= dir] '
Le dice a tar que cree un nuevo directorio debajo del directorio de extracción (o el que se pasó a '-C') y lo use para protegerse de las tarbombas. En ausencia de un argumento dir, el nombre del nuevo directorio será igual al nombre base del archivo (nombre del archivo menos el sufijo del archivo, si se reconoce). Cualquier nombre de miembro que no comience con ese nombre de directorio (después de las transformaciones de `--transform 'y` --strip-components') tendrá el prefijo. Los sufijos de nombre de archivo reconocidos son `.tar ', y cualquier sufijo de compresión reconocible por See -auto-compress .
Como se señaló en los comentarios , este método no funciona para archivos que están formados correctamente, sin embargo, como muestra otra respuesta , debe agregar --strip-components 1
para que esto realmente funcione. He probado con esta nueva opción y funciona tanto para archivos con un nombre de nivel superior como sin ellos.
pretty_name
, con el directorio original de nivel superior dentro de eso. Por ejemplo, si tar xzf ugly_name.tgz
crearía un directorio llamado ugly_name/
, se crearía el comando que ha proporcionado pretty_name/ugly_name/
.