我有一個 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}`}