У меня есть 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}`}