2011-03-21 55 views
1

當我調用我的腳本時,需要找到存檔的類型(壓縮方法),並按照壓縮方法使用帶有正確選項的tar。如何在bash中找到存檔的壓縮方法

我發現該文件命令返回有關文件的信息,所以我可以得到第二列,並使用一些條件,並檢查它是什麼(我只需要支持tar壓縮gzip或bzip2不壓縮和zip但我不應該'通過後綴檢查,但通過內容)。

所以我想問問是否有更好的方法來獲得壓縮的檔案方法,然後由文件和獲得第二列。謝謝

+0

不清楚你不喜歡'file'程序的輸出(並且真的不清楚你在說什麼...你應該使用關鍵字,命令名等標記 – nhed 2011-03-21 15:33:41

回答

2

你最好的選擇是要麼依賴於file因爲你是現在,或者查找可能的幻數(通常放置在文件開頭的文件類型標識符)並自行解決。

例如,ZIP文件以「PK」開頭,BZip2文件以「BZ」開頭。這些神奇的數字可能會更長,但這就是我剛纔看到一對夫婦時注意到的。

4

GNU焦油的最新版本本身就是數字,所以你不需要tar -xvf myarchive.tar.gz就足夠了

否則使用例如這樣的:

function extract() 
{ 
    if [ -f $1 ] ; then 
     case $1 in 
      *.tar.bz2) tar xvjf $1  ;; 
      *.tar.gz) tar xvzf $1  ;; 
      *.bz2)  bunzip2 $1  ;; 
      *.rar)  unrar x $1  ;; 
      *.gz)  gunzip $1  ;; 
      *.tar)  tar xvf $1  ;; 
      *.tbz2)  tar xvjf $1  ;; 
      *.tgz)  tar xvzf $1  ;; 
      *.zip)  unzip $1  ;; 
      *.Z)   uncompress $1 ;; 
      *.7z)  7z x $1   ;; 
      *)   echo "'$1' cannot be extracted via >extract<" ;; 
     esac 
    else 
     echo "'$1' is not a valid file" 
    fi 
} 

如果要檢查的內容,並照顧唯一的bzip2或gzip壓縮tar歸檔,這樣做:

function extract() { 
    if file $1 | grep bzip2 >/dev/null ; then 
     tar -xvjf $1 
    elif file $1 | grep gzip >/dev/null ; then 
     tar -xvzf $1 
    else 
     echo "'$1' is not a valid file" 
    fi 
} 
+0

我需要通過代碼而不是tar,所以我需要查找,在你的例子中,你使用的是postfix的權利?我不應該使用它,我必須使用該檔案中的內容。 – 2011-03-21 14:49:12