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

相關內容