Digamos que eu tenha o arquivo chamado ugly_name.tar
, que quando extraído, se torna ugly_name
diretório. Que comando eu posso usar para que o nome do diretório resultante seja pretty_name
?
125
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):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:Se você não souber o nome do diretório de nível superior, ainda poderá usar esse método, embora prefira
--strip-components
.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.fonte
Usa isto :
fonte
&&
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
fonte
--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étodomkdir
ou--strip-components 1
, caso contrário, você simplesmente obtémpretty_name/ugly_name/
.No askUbuntu, esta resposta funcionou para mim:
Atualizar
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.fonte
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 chamadougly_name/
, o comando que você forneceu criarápretty_name/ugly_name/
.