Извлечь файл из каталога внутри tar-файла, не создавая этот каталог

Извлечь файл из каталога внутри tar-файла, не создавая этот каталог

У меня есть tarfile, имеющий следующую структуру:

- dir1
 -- file
- dir2
- dir3

Если я попробую запустить tar -xf tarfile.tar.gz dir1/file, будет создан dir1, содержащий файл. Вместо этого я хотел бы просто получить файл без каталога между ними. Я мог бы переместить файл и удалить каталог, но мне было интересно, поддерживает ли команда tar возможность сделать это напрямую.

Я использую Alpine Linux.

решение1

POSIXly (за исключением gunzipчасти, которая не является командой POSIX):

gunzip < file.tar.gz | pax -rs'|.*/||' dir1/file1

С bsdtar:

tar -s'|.*/||' -xf file.tar.gz dir1/file1

С GNU tar:

tar --transform='s|.*/||' -xf file.tar.gz dir1/file1

С star:

star -s '|*/||' -x -f file.tar.gz dir1/file1

Обратите внимание, что в некоторых случаях, если файл является символической ссылкой, замена также повлияет на цель символической ссылки.

решение2

Вы можете извлечь данные в стандартный вывод (-O) и направить их в нужный файл.

решение3

Вот мое решение на Ruby. Я не пытаюсь правильно обрабатывать символические ссылки, но это можно было бы добавить, конечно.

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

Связанный контент