Respostas:
Isso deve funcionar:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
muda para o diretório especificado antes de descompactar (ou empacotar). --strip-components
remove 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-components
opçã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_name
diretório. A propósito, a beleza está nos olhos de quem vê.
Com o GNU tar ≥1,16, use --transform
para 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 pax
o utilitário de arquivamento POSIX, use a -s
opçã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_name
já existir.
Maneira mais simples
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
sem --strip-components 1
. (2) Por outro lado, a resposta aceita (postada por Mat) aparece --strip-components 1
sem --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 mkdir
ou --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 1
para 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.tgz
criar um diretório chamado ugly_name/
, o comando que você forneceu criará pretty_name/ugly_name/
.