rm 명령의 구문. -r 옵션 사용에 대한 걱정

rm 명령의 구문. -r 옵션 사용에 대한 걱정

제가 만들고 있는 백업 파일을 관리하는 루틴을 만들어 프로세스 중에 오래된 폴더가 자동으로 삭제되도록 하려고 합니다. 이것이 내가 얻는 것입니다:

#!/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

코드의 코딩 방식에 몇 가지 문제가 있습니다.

  1. 특히 다음 명령이 이전 명령의 성공에 따라 달라지는 경우 이러한 명령의 성공을 확인해야 합니다.
  2. 목록 컨텍스트에서 인용되지 않은 변수를 유지하는 것은 쉘에게 이를 분할하고 파일 이름 생성을 수행하도록 요청하는 것입니다. 여기서는 이를 수행할 이유가 없습니다.

현재로서는 rm -r디렉터리와 해당 내용을 모두 삭제하는 것을 의미합니다. 이 작업을 수행할 때 심볼릭 링크를 따르지 않습니다. 심볼릭 링크 이더라도 /home/fauna/backup/$oldday심볼릭 링크만 삭제됩니다. 이것이 당신이 원하는 것일 수도 있습니다. rm -r "/home/fauna/backup/$oldday/"(후행을 사용하여 ) 이렇게 하면 /상황이 달라집니다.

그러나 그렇지 않은 경우 -fstdin이 터미널인 경우 쓰기 불가능한 파일을 삭제하라는 메시지가 표시될 수 있습니다. 따라서 무인 스크립트라면 추가해야 할 것입니다. 마찬가지로 -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하면 셸이 종료되도록 할 수도 있습니다. 너무 많은 트랩은 안정적으로 사용할 수 없습니다(그러나 이 간단한 경우에는 그렇지 않음).|| exitset -e

관련 정보