Respostas:
Isso deve funcionar:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-Cmuda para o diretório especificado antes de descompactar (ou empacotar). --strip-componentsremove o número especificado de diretórios dos nomes de arquivos armazenados no arquivo morto.
Observe que isso não é realmente portátil. O tar do GNU e pelo menos alguns dos alcatrões do BSD têm a --strip-componentsopção, mas parece não existir em outras plataformas do tipo unix.
A maneira idiota de fazer isso funcionaria praticamente em todos os lugares.
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_namediretório. A propósito, a beleza está nos olhos de quem vê.
Com o GNU tar ≥1,16, use --transformpara aplicar uma transformação sed regexp a cada nome de arquivo (a transformação é aplicada no caminho completo do arquivo morto):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Se ugly_nameé o componente de nível superior de todos os nomes de arquivos no arquivo morto, você não precisa se preocupar com a correspondência precisa:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Se você não souber o nome do diretório de nível superior, ainda poderá usar esse método, embora prefira --strip-components.
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
Com paxo utilitário de arquivamento POSIX, use a -sopção, que aceita uma expressão de substituição semelhante 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!'
Usa isto :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&operador de lista entre esses dois comandos, para que o segundo seja executado apenas se o primeiro tiver êxito.
ugly_namejá existir.
Maneira mais simples
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_namesem --strip-components 1. (2) Por outro lado, a resposta aceita (postada por Mat) aparece --strip-components 1sem --one-top-level=pretty_name. (3) Você pode explicar por que sua resposta, combinando essas opções, é melhor do que qualquer uma das mais antigas? Por favor, não responda nos comentários; edite sua resposta para torná-la mais clara e completa.
--strip-component 1é necessário, com o método mkdirou --strip-components 1, caso contrário, você simplesmente obtém pretty_name/ugly_name/.
No askUbuntu, esta resposta funcionou para mim:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--um nível superior [= dir] '
Diz ao tar para criar um novo diretório abaixo do diretório de extração (ou o passado para `-C ') e usá-lo para proteger-se contra tarbombs. Na ausência de argumento dir, o nome do novo diretório será igual ao nome base do arquivo morto (nome do arquivo menos o sufixo do arquivo morto, se reconhecido). Qualquer nome de membro que não comece com esse nome de diretório (após transformações de `--transform 'e` --strip-components') será prefixado com ele. Os sufixos de nome de arquivo reconhecidos são `.tar 'e qualquer sufixo de compactação reconhecível por See -auto-compress .
Conforme apontado nos comentários , esse método não funciona para arquivos formados corretamente, no entanto, como mostra outra resposta , você deve adicionar --strip-components 1para que isso realmente funcione. Eu testei com esta nova opção e funciona tanto para arquivos com um nome de nível superior quanto para aqueles sem.
pretty_name, com o diretório de nível superior original dentro dele. Por exemplo, se você tar xzf ugly_name.tgzcriar um diretório chamado ugly_name/, o comando que você forneceu criará pretty_name/ugly_name/.