제가 만들고 있는 백업 파일을 관리하는 루틴을 만들어 프로세스 중에 오래된 폴더가 자동으로 삭제되도록 하려고 합니다. 이것이 내가 얻는 것입니다:
#!/bin/sh
day=$(date +%m%d%y)
oldday=$(date -d "-4 days" +%m%d%y)
mkdir /home/fauna/backup/$day
rm -r /home/fauna/backup/$oldday
cp /home/fauna/backup/backup.sh /home/fauna/backup/$day
cd /home/fauna/backup/$day
./backup.sh
backup.sh
실제로 백업 파일을 생성한 후 해당 파일이 포함된 폴더를 원격 위치에 복사합니다.
이 rm
줄은 의도하지 않은 결과 없이 이전 폴더를 삭제합니까?
으로 옮길 수 있어요뒤쪽에와이어 backup.sh
?
답변1
수표를 추가하는 것이 좋습니다.
if [[ -d ~/backup/$oldday ]]; then
rm -rf "$HOME/backup/$oldday"
fi
또한 bash에서는 작은따옴표나 큰따옴표를 올바르게 사용하는 것이 중요합니다. 공백이 포함된 디렉토리 이름은 특히 따옴표를 사용하지 않을 때 문제를 일으킬 수 있습니다.
업데이트: OP가 bash를 사용하기를 원한다고 가정합니다.
답변2
코드의 코딩 방식에 몇 가지 문제가 있습니다.
- 특히 다음 명령이 이전 명령의 성공에 따라 달라지는 경우 이러한 명령의 성공을 확인해야 합니다.
- 목록 컨텍스트에서 인용되지 않은 변수를 유지하는 것은 쉘에게 이를 분할하고 파일 이름 생성을 수행하도록 요청하는 것입니다. 여기서는 이를 수행할 이유가 없습니다.
현재로서는 rm -r
디렉터리와 해당 내용을 모두 삭제하는 것을 의미합니다. 이 작업을 수행할 때 심볼릭 링크를 따르지 않습니다. 심볼릭 링크 이더라도 /home/fauna/backup/$oldday
심볼릭 링크만 삭제됩니다. 이것이 당신이 원하는 것일 수도 있습니다. rm -r "/home/fauna/backup/$oldday/"
(후행을 사용하여 ) 이렇게 하면 /
상황이 달라집니다.
그러나 그렇지 않은 경우 -f
stdin이 터미널인 경우 쓰기 불가능한 파일을 삭제하라는 메시지가 표시될 수 있습니다. 따라서 무인 스크립트라면 추가해야 할 것입니다. 마찬가지로 -f
, rm
디렉토리가 아직 존재하는 경우에만 실패가 보고됩니다.
#!/bin/sh -
day=$(date +%m%d%y) || exit
oldday=$(date -d "-4 days" +%m%d%y) || exit
# date is very unlikely to fail, but if it does, it would have dramatic consequences
# shouldn't access to those directories be restricted (if it hasn't been
# restricted already some levels above)?
# umask 077
mkdir -p "/home/fauna/backup/$day" || exit
# with -p, mkdir would only fail if the directory is not there after that call.
# It may not be what you want though. You may want mkdir to fail if the
# directory already existed in which case you'd want to omit the -p.
cp /home/fauna/backup/backup.sh "/home/fauna/backup/$day" || exit
cd "/home/fauna/backup/$day" || exit
./backup.sh || exit
# only delete the old one if the new one succeeds.
rm -rf "/home/fauna/backup/$oldday"
|| exit
여기서는 모든 명령에 추가하므로 이를 사용하여 어떤 명령에서든 오류 가 발생 set -e
하면 셸이 종료되도록 할 수도 있습니다. 너무 많은 트랩은 안정적으로 사용할 수 없습니다(그러나 이 간단한 경우에는 그렇지 않음).|| exit
set -e