2016-12-14 91 views
0

我有一個壓縮的tar歸檔文件,我想從歸檔文件的深處提取一個文件到當前的工作目錄。如何在不創建子目錄的情況下從tar歸檔文件中提取文件?

有沒有比tar好的東西,或者一種沒有目錄組件的方式來提取它?

我做得像現在這樣的權利:

tar xfvz $file -C $destination $folder"/"$file 
cd $destination"/"$folder 
mv $file ../$file 
rm -r $folder 

但我有時刪除錯誤$folder。我的存檔是:mytar.tar.gz。 裏面我有myfolder/mysecondfolder/hello.txt

我想在當前目錄中提取myfolder/mysecondfolder/hello.txt作爲hello.txt

+0

你知道你想提取的文件名'.tar'?假設你只想從檔案中提取這個文件? – Inian

+0

我知道文件的名稱是的,但我可能不知道文件夾名稱或文件夾的數量,然後我才能到達文件 – Kryze

+0

而且您只希望該文件沒有解析的文件夾級別? 'tar'不能以這種方式工作,直到文件存在的級別的內部文件夾被留下。您必須稍後手動刪除文件夾。你能否更新問題中的存檔並再次聲明你的異常? – Inian

回答

-2

只需在壓縮包名稱後給出文件的完整存儲路徑即可。

例子:假設你想從2.pdf文件test.tar.gz

tar -zxvf test.tar.gz 2.pdf

+0

它不工作,則該命令從存檔 焦油解壓文件夾太-xf 1481648808.tar.gz 1481648808/hello.txt.gpg LS 1481648808 1481648808.tar.gz 該文件夾是從我的tar.gz – Kryze

+0

提取@Kryze:如果你正在尋找的文件存在於'x/y/file'裏面,文件夾'x/y'停留在後面,你提出的問題不能在一個簡單的tar提取中實現。 – Inian

+0

@Kryze更新,現在這個作品。文件2。pdf在與test.tar.gz相同的目錄中提取。 – akskas

2

如果GNU焦油是可用的,你可以使用--strip-components參數:

#!/bin/bash 
file_to_extract=myfolder/mysecondfolder/hello.txt 
depth=$(awk -F/ '{print NF-1}' <<< "$file_to_extract") 
tar zxvf mytar.tar.gz --strip-components="$depth" "$file_to_extract" 

從人焦油:

--strip-components=NUMBER 
     strip NUMBER leading components from file names on extraction 

來源:https://www.linuxquestions.org/questions/linux-newbie-8/extracting-tar-gz-files-in-current-directory-689243/#postmenu_3368879


更短的解決方案是使用--transform選項,建議由託比·斯佩特:

tar zxvf mytar.tar.gz --transform='s,.*/,,' myfolder/mysecondfolder/hello.txt 
+0

您能向我解釋「深度」行嗎?謝謝 – Kryze

+0

@Kryze:'--strip-components'參數需要知道有多少主要的目錄需要去除,所以我們使用awk來計算文件路徑中的斜線數。 – user000001

+1

你可以避免使用'--transform =',。*/,,''或類似的東西(這也是一個GNU擴展)來計算'/'。 –

相關問題