Extraia o arquivo do diretório dentro do arquivo tar sem criar esse diretório

Extraia o arquivo do diretório dentro do arquivo tar sem criar esse diretório

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 gunzipparte 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}`}

informação relacionada