211

関数を含む bash スクリプトを作成しようとしているので.tar.tar.bz2.tar.gzなどのファイルを指定すると、関連するスイッチを指定して tar を使用してファイルを解凍します。

ファイル名をテストして末尾を確認する if elif then ステートメントを使用していますが、正規表現のメタ文字を使用して一致させることができません。

コマンドラインで「test」を使用しているスクリプトを常に書き換える手間を省くために、以下のステートメントが機能するはずだと思いました。ブラケット、引用符、およびメタ文字の可能な限りの組み合わせを試しましたが、それでも失敗します。

test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)

問題は単純なものであると確信しており、どこでも見てきましたが、その方法を理解することはできません。誰かが私がこれを行う方法を知っていますか?

4

6 に答える 6

71

これを行う関数

extract () {
  if [ -f $1 ] ; then
      case $1 in
          *.tar.bz2)   tar xvjf $1    ;;
          *.tar.gz)    tar xvzf $1    ;;
          *.bz2)       bunzip2 $1     ;;
          *.rar)       rar 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 "don't know '$1'..." ;;
      esac
  else
      echo "'$1' is not a valid file!"
  fi
}

その他の注意事項

上記のコメントの Aquarius Power への返信として、We need to store the regex on a var

式を一致させた後に変数 BASH_REMATCH が設定され、${BASH_REMATCH[n]} は括弧で囲まれた n 番目のグループ、つまり次のグループと一致します${BASH_REMATCH[1]} = "compressed"${BASH_REMATCH[2]} = ".gz"

if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]]; 
then 
  echo ${BASH_REMATCH[2]} ; 
else 
  echo "Not proper format"; 
fi

(上記の正規表現は、ファイルの命名と拡張子に有効なものではありませんが、この例では機能します)

于 2014-12-11T22:50:34.230 に答える