Digamos que tengo un nombre de archivo ugly_name.tar, que cuando se extrae, se convierte en ugly_namedirectorio. ¿Qué comando puedo usar para que el nombre del directorio resultante sea en su pretty_namelugar?
125
Esto debería funcionar:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-Ccambia al directorio especificado antes de desempaquetar (o empacar). --strip-componentselimina 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-componentsopció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_nameugly_namedirectorio. Por cierto, la belleza está en el ojo del espectador.Con GNU tar ≥1.16, use
--transformpara 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_namees 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
paxla utilidad de archivo POSIX, use la-sopció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_nameya existe un directorio .La manera más simple
fuente
--one-top-level=pretty_namesin--strip-components 1. (2) Por el contrario, la respuesta aceptada (publicada por Mat) presenta--strip-components 1sin--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 1Se requiere @ G-Man , ya sea con el métodomkdiro--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 1para 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.tgzcrearía un directorio llamadougly_name/, se crearía el comando que ha proporcionadopretty_name/ugly_name/.