スクリプトがtarを抽出して抽出されたtarディレクトリに移動するにはどうすればよいですか?
頑張っています
抜粋
#!/bin/bash
tar -xvf $1 && cd $1
使用例
次の使用法があるとしますfoo.tar.xz
。./xtract foo.tar.xz
これにより、私の問題がパラメータにあることがわかります。正常に抽出しましたが、ファイル拡張子のため入力できません。それでは、foo
ディレクトリに移動できるようにパラメータからそれらを削除する方法は?
答え1
シェルスクリプトは、親プロセス(スクリプトを呼び出したシェル)の作業ディレクトリを変更できません。したがって、作成したディレクトリに変更できる間存在するスクリプトの場合、スクリプトが終了すると(特定のディレクトリがプロセスの現在のディレクトリであるという事実を含む環境が破壊された場合)、スクリプトを実行していたディレクトリを見つけることができます。
ただし、シェル機能は現在のシェルセッション内で実行され、セッションの現在のcd
作業ディレクトリは期待どおりに設定できます。
以下は、tar
コマンドラインで指定されたアーカイブを抽出しようとし、成功した場合は、アーカイブ名に付属のディレクトリに変更して最後から.tar
削除するシェル関数です(これは標準的な方法で行われます)。パラメータ拡張)。
xtract () {
tar -x -v -f "$1" &&
cd -- "${1%.tar}"
}
上記をシェルに貼り付けてこの関数を定義するか、通常はシェル関数とエイリアスを追加する場所に追加することができ、次のシェルセッションで使用できます。
xz
圧縮アーカイブをサポートするには、上記の機能を変更してシステムにtar
適したオプションを使用するか(例:GNUを使用)、アーカイブを。指定されたアーカイブファイル名の末尾から削除する代わりに削除されます。tar
-J
--xz
tar
xz -d -c -- "$1"
tar -x -v -f -
cd
.tar.xz
.tar
tar
圧縮アルゴリズムを正しく決定するためにファイル名サフィックスを使用するのと同じくらい賢い場合は、次のようにします。
xtract () {
tar -x -v -f "$1" &&
cd -- "${1%.tar.*}"
}
前の関数との違いは、まず.tar
点を削除してから点を削除してからランダムな文字列cd
入力したいディレクトリに到達するには、アーカイブ名の末尾から始めます。