Eu tenho um tarfile que possui a seguinte estrutura:
- dir1
-- file
- dir2
- dir3
Se eu tentar executar tar -xf tarfile.tar.gz dir1/file
, dir1 contendo o arquivo será criado. Em vez disso, gostaria de obter apenas o arquivo sem o diretório intermediário. Eu poderia mover o arquivo e excluir o diretório, mas gostaria de saber se o comando tar oferece suporte para fazer isso diretamente.
Estou usando o Alpine Linux.
Responder1
POSIXly (exceto a gunzip
parte que não é um comando POSIX):
gunzip < file.tar.gz | pax -rs'|.*/||' dir1/file1
Com bsdtar
:
tar -s'|.*/||' -xf file.tar.gz dir1/file1
Com GNU tar
:
tar --transform='s|.*/||' -xf file.tar.gz dir1/file1
Com star
:
star -s '|*/||' -x -f file.tar.gz dir1/file1
Observe que para alguns deles, se o arquivo for um link simbólico, a substituição também afetará o destino do link simbólico.
Responder2
Você pode extrair para stdout (-O) e canalizá-lo para o nome de arquivo desejado.
Responder3
Aqui está minha solução em Ruby. Não faço nenhuma tentativa de lidar com links simbólicos corretamente, mas isso poderia ser adicionado, é claro.
outfiles = `tar zxvf #{ARGV[0]}`
root_dirs = {}
outfiles.each_line do |l|
s = l.split('/')
root_dirs[s[0]] = 1
`mv #{l.chomp} ./#{s[-1]}`
end
root_dirs.each_key {|rd| `rm -rf #{rd}`}