쉘 스크립트에서 현재 타임스탬프를 사용하여 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. 이 목적으로 예약된 베어 저장소에 푸시할 수 있습니다. 모든 브랜치를 푸시할 수 있으며, 참조 로그에는 문제가 발생할 경우를 대비해 기록도 유지됩니다.

관련 정보