디렉터리 백업 전략

ShellBeginner
지금 연습하기

소개

매일 자라는 식물의 사진을 찍는다고 생각해 보겠습니다. 모든 사진의 이름을 plant.jpg로 지정하면 새 사진을 저장할 때마다 이전 사진을 덮어쓰므로 기록을 잃게 됩니다. 모든 사진을 보존하려면 plant_2023-01-01.jpg, plant_2023-01-02.jpg와 같이 이름을 지정해야 합니다.

시스템 백업에서도 같은 문제가 발생합니다. 항상 같은 파일 이름에 저장하면 새 백업이 이전 백업을 덮어써 복구 기록이 사라질 수 있습니다.

이 실습에서는 파일 이름에 날짜를 자동으로 포함하는 방법을 배웁니다. 백업 파일이 언제 생성되었는지 확인할 수 있고 여러 세대의 백업을 보존할 수 있기 때문에, 타임스탬프가 포함된 백업은 실제 환경에서 매우 일반적으로 사용됩니다.

다음 내용을 배웁니다.

  1. Linux 에서 오늘 날짜를 특정 형식으로 출력하는 방법
  2. 날짜를 "상자"(변수) 에 저장하는 방법
  3. 저장한 날짜를 사용해 타임스탬프가 포함된 고유한 백업 파일을 만드는 방법

오늘 날짜 가져오기

이 단계에서는 date 명령으로 현재 날짜의 형식을 지정하는 방법을 배웁니다. 이 날짜는 동적인 파일 이름을 만들기 위한 첫 번째 요소입니다.

기본 date 명령은 현재 날짜와 시간을 길고 자세한 형식으로 출력합니다. 하지만 파일 이름에는 보통 YYYY-MM-DD처럼 깔끔하고 정렬하기 쉬운 형식을 사용합니다. Linux 에서는 + 기호 뒤에 형식 코드를 지정해 출력 형식을 바꿀 수 있습니다. %F 코드는 "전체 날짜 (Full Date)"인 연 - 월 - 일 형식을 간단히 지정하는 편리한 방법입니다.

이 형식은 보기 좋기만 한 것이 아닙니다. YYYY-MM-DD 형식을 사용하면 파일 이름을 알파벳순으로 정렬할 때 시간순으로도 정렬되므로 실제 파일 관리에 유용합니다.

먼저 현재 프로젝트 폴더에 있는지 확인합니다.

cd ~/project

이제 원하는 형식으로 날짜를 출력하도록 시스템에 요청합니다.

date +%F

다음과 같은 결과가 출력됩니다. 실제로는 오늘 날짜가 표시됩니다.

2023-10-27

이 결과를 파일 이름에 사용하려면 결과를 저장해야 합니다. **명령 치환 (Command Substitution)**을 사용하면 됩니다. 명령을 $(...)라는 말풍선 안에 넣는다고 생각하면 됩니다. 셸은 먼저 말풍선 안의 명령을 실행하고, 그 결과를 가져온 다음 말풍선을 해당 텍스트로 바꿉니다.

명령 치환은 간단한 명령줄 사용과 자동화를 연결하는 셸의 핵심 개념 중 하나입니다. 명령의 출력 결과를 다른 명령의 데이터로 사용할 수 있게 해 줍니다.

이제 날짜를 **변수 (Variable)**에 저장해 보겠습니다. 변수는 이름이 붙은 저장 공간입니다. current_date라는 이름의 저장 공간을 만들고 그 안에 명령의 출력 결과를 넣습니다.

current_date=$(date +%F)

중요: = 기호 앞뒤에 공백이 없어야 합니다. 셸에서는 반드시 지켜야 하는 규칙입니다. variable = value는 실패하지만 variable=value는 정상적으로 동작합니다.

이제 저장 공간 안에 날짜가 들어 있는지 확인합니다. 변수 이름 앞에 $ 기호를 붙인 뒤 echo 명령을 사용하면 변수에 저장된 값을 출력할 수 있습니다.

echo $current_date

오늘 날짜가 출력되면 날짜를 변수에 성공적으로 저장한 것입니다.

백업 파일 만들기

날짜를 변수에 저장했으므로, 이제 이 값을 사용해 규칙적인 이름의 백업 파일을 만들 수 있습니다.

디렉터리에 project_plan.txt라는 파일을 준비해 두었습니다. 파일이 있는지 확인합니다.

ls -l project_plan.txt

이 파일의 복사본을 project_plan_YYYY-MM-DD.bak라는 이름으로 만드는 것이 목표입니다. 이렇게 하면 복사본 이름에 오늘 날짜가 포함됩니다.

표준 cp(복사) 명령을 사용합니다. 날짜를 직접 입력하는 대신 변수 $current_date를 사용해 셸이 날짜를 삽입하도록 합니다.

다음 명령을 실행합니다.

cp project_plan.txt "project_plan_$current_date.bak"

셸은 큰따옴표 안의 $current_date를 확인하면 cp 명령을 실행하기 전에 변수에 저장된 실제 날짜 (예: 2023-10-27) 로 즉시 바꿉니다.

이를 **변수 확장 (variable expansion)**이라고 합니다. 셸은 cp 명령을 실제로 실행하기 전에 변수를 확장합니다. 따라서 cp 자체가 셸 변수를 이해하지 못해도 명령이 동적으로 동작합니다.

참고: 변수 단계를 생략하고 한 줄로 처리할 수도 있습니다. 자동화 스크립트에서 매우 자주 사용하는 방식입니다. $(...) 명령 치환을 cp 명령 안에 직접 넣습니다.

cp project_plan.txt "project_plan_$(date +%F).bak"

이 명령은 셸에 다음과 같이 지시합니다. "date 명령을 실행하고, 그 결과를 이 위치에 삽입한 다음, 복사 명령을 실행합니다." 두 방법은 완전히 같은 결과를 만듭니다.

백업 확인하기

작업이 정상적으로 완료되었는지 확인합니다. 이제 원본 파일과 날짜가 포함된 복사본, 두 개의 파일이 있어야 합니다.

디렉터리의 파일을 나열합니다.

ls -l

다음과 비슷한 결과가 표시됩니다.

-rw-rw-r-- 1 labex labex 65 Oct 27 10:00 project_plan.txt
-rw-rw-r-- 1 labex labex 65 Oct 27 10:05 project_plan_2023-10-27.bak

새 파일 이름에 날짜가 포함되어 있는지 확인합니다.

마지막으로 백업 파일의 내용이 정상인지 확인합니다. cat 명령으로 새 파일을 읽을 수 있습니다. 날짜 전체를 다시 입력하지 않아도 되도록 명령 치환을 다시 사용합니다.

cat project_plan_$(date +%F).bak

원본과 같은 텍스트가 출력됩니다.

Phase 1: Initialization
Phase 2: Development
Phase 3: Deployment

성공입니다! 타임스탬프가 포함된 백업을 만들었습니다. 내일 같은 명령을 실행하면 내일 날짜가 포함된 새 파일이 생성되므로, 백업 기록을 안전하고 체계적으로 보존할 수 있습니다.

이처럼 간단한 파일 이름 지정 습관은 다양한 환경에 적용할 수 있습니다. 많은 백업 순환 방식이 바로 이 아이디어에서 시작합니다. 파일 이름에 시간을 기록하면 최신 복사본을 덮어쓰지 않고 여러 세대의 백업을 보존할 수 있습니다.

요약

축하합니다! 핵심적인 자동화 기술을 익혔습니다.

이 실습에서는 다음 내용을 배웠습니다.

  • 시간 형식 지정: date +%F를 사용해 컴퓨터에서 처리하기 쉬운 날짜 문자열을 가져오는 방법
  • 명령 치환: $(...)을 사용해 한 명령의 결과를 다른 명령에 전달하는 방법
  • 동적인 이름 지정: 현재 날짜를 기준으로 파일 이름을 자동으로 만드는 방법

이처럼 간단한 기법은 전문적인 백업 전략의 기반이 됩니다. 이제 파일을 실수로 덮어쓰는 일을 방지할 수 있습니다!