シェルスクリプトで現在のタイムスタンプを使用してtarファイルを作成する

シェルスクリプトで現在のタイムスタンプを使用してtarファイルを作成する

私のgitリポジトリをバックアップし、現在の名前で特定のバックアップディレクトリに保存するシェルスクリプトを作成しようとしています。

これまで私は以下を持っています:

#!/bin/bash

branch="master"

if [ $# -eq 1 ]
  then
    branch=$1
fi

workspace="~/GIT_Workspace/my_project/"
timestamp=$(date +%d_%b_%Y)
filename="~/GIT_Workspace/Back/$timestamp-$branch.tar.gz"

echo "*** Updating branch: $branch ***"
#git -C "$workspace" checkout "$branch"
#git -C "$workspace" fetch origin
#git -C "$workspace" pull origin "$branch"

echo "*** Saving to file $filename"
tar -zcvf "$filename" "$workspace"

tarファイルを生成できず、常に次のエラーで失敗します。

tar: Failed to open '~/GIT_Workspace/Back/10_Mar_2015-master.tar.gz'

助けが必要ですか?

答え1

次の行で

workspace="~/GIT_Workspace/my_project/"
filename="~/GIT_Workspace/Back/$timestamp-$branch.tar.gz"

~引用符内にあるため、ホームディレクトリには展開されません。拡張には外部引用符が必要です。したがって、スクリプトは~もちろん、存在しないリテラル文字で始まるファイルを開こうとします。

オプション:

  • variable="$HOME/GIT_Workspace"。私たちは、チルダ拡張が一般的にインタラクティブな機能と見なされ、非対話型の方法で使用しないことが最善であることを除いて、妥当な理由なくスクリプト~で完全に使用されないことがよくあります。$HOME(悪い理由だけどそこにいますね…)
  • variable=~/GIT_Workspace引用はまったくありません。しかし、私たちは通常、インタラクティブな使用ではなく、スクリプトで引用文を非常に勤勉に使用しようとします。なぜなら誰かがいつ来て空白のある引数を提供し、引用文を要求するのか分からないからです。防御プログラミング。
  • variable=~"/GIT_Workspace" with the引用符の外の~`は奇妙に見えますが、うまくいきます。

最初のオプションをお勧めします。

その他の提案:

  • あなたのスクリプトはbashismを使用していないようですので、/bin/sh代わりに移植可能な方が良いでしょう。可能でない/bin/bash限り、shebang 行を変更して正常にスクリプト化することをお勧めします。/bin/sh本物少し屈辱を使用してください。
  • 日付にISO 8601形式(%Y-%m-%d)を使用すると、自然に時間順にソートされ、自然言語の依存関係の影響を受けません。私はあなたもそうするように励ます。
  • gitgitリポジトリをバックアップする代わりに使用を検討することもできますtar。この目的のために予約されたベアリポジトリにプッシュできます。すべてのブランチをプッシュでき、参照ログには問題が発生した場合に備えて履歴も保持されます。

関連情報