Digamos que tengo un nombre de archivo ugly_name.tar
, que cuando se extrae, se convierte en ugly_name
directorio. ¿Qué comando puedo usar para que el nombre del directorio resultante sea en su pretty_name
lugar?
125
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):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:Si no conoce el nombre del directorio de nivel superior, aún puede usar este método, aunque puede preferirlo
--strip-components
.Con
pax
la utilidad de archivo POSIX, use la-s
opción, que toma una expresión de reemplazo similar a sed como argumento.fuente
Utilizar este :
fuente
&&
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
fuente
--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étodomkdir
o--strip-components 1
, de lo contrario, solo obtendrápretty_name/ugly_name/
.Desde askUbuntu, esta respuesta funcionó para mí:
Actualizar
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.fuente
pretty_name
, con el directorio original de nivel superior dentro de eso. Por ejemplo, sitar xzf ugly_name.tgz
crearía un directorio llamadougly_name/
, se crearía el comando que ha proporcionadopretty_name/ugly_name/
.