먼저 일일 백업 파일의 파일 이름 예는 다음과 같습니다.
website-db-backup06-June-2020.tar.gz
아래 스크립트는 터미널을 통해 수동으로 실행할 때 제대로 실행됩니다. 그러나 cron을 통해 스크립트가 실행되면 이메일로 다음 cron 데몬 메시지를 받습니다.
tar: website-db-backup*: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
매주 모든 일일 백업을 압축하는 스크립트는 다음과 같습니다.
#!/bin/bash
#
# Weekly compression for database backups
BACKUP_PATH=~/backup/web/database
BACKUP_FILE_DATE=`date '+%d-%B-%Y'`
tar -czf $BACKUP_PATH/website-db-weekly-compress$BACKUP_FILE_DATE.tar.gz \
-C $BACKUP_PATH/ website-db-backup* && rm $BACKUP_PATH/website-db-backup*
일일 백업에는 파일 이름이 있으므로 스크립트에서 사용해야 date
합니다 . *
이것이 이유일까요?
답변1
문제는 스크립트의 현재 작업 디렉터리입니다. website-db-backup*
경로가 없으므로 현재 디렉터리에서 실행됩니다. 스크립트에 다음을 추가해야 합니다.
SOURCE_DIR_PATH='/path/to/backup_source'
cd "$SOURCE_DIR_PATH" || exit 1
또한 다음을 실행하기 전에 일치하는 파일이 있는지 확인해야 합니다 tar
.
shopt -s nullglob
set -- website-db-backup*
test $# -eq 0 && { echo 'ERROR: No matching files; aborting'; exit 1; }
이 경우 문제가 되지 않을 수도 있지만 danielleontiev가 주석에서 지적했듯이 ~
해당 스크립트가 다른 사용자에 의해 실행될 수 있다면 스크립트에서 사용하는 것은 위험합니다. 예상 경로로 바꾸는 것이 좋습니다.
답변2
전역 확장이 실패 하면 failglob
전체 명령이 실패하게 됩니다(아무 작업도 수행하지 않음). 쉘의 무작동 연산자 :
(콜론)와 결합하면 glob의 결과(성공 또는 실패)를 테스트하는 완벽한 방법입니다.
shopt -s failglob
: website-db-backup*
# The following code is purely indicative
if [ $? -eq 0 ]; then
echo "Success, website-db-backup* exists"
else
echo "Failed, nothing matches website-db-backup*"
fi
이것보다 낫다호크 라킨의 답변내부에$1
기존 위치 매개변수( 등) 를 파괴하지 않습니다 ., 하지만 다음 함수를 사용하여 이 문제를 해결할 수 있습니다.
shopt -s nullglob
argc() {
return $#
}
argc website-db-backup*
# Now check $? the same way as above
# $1, $2, ... remain untouched
Bash 배열도 좋은 선택입니다.
shopt -s nullglob
FILES=(website-db-backup*)
echo "${#FILES[@]}" # gives number of matched files
내 생각에는 이것이 가장 간단하고 우아한 해결책이다.