자잘한 내용 수

This commit is contained in:
LHK
2025-08-01 16:04:49 +09:00
부모 7ba60e8561
커밋 12b61d4c48
3개의 변경된 파일56개의 추가작업 그리고 15개의 파일을 삭제

파일 보기

@@ -1,5 +1,35 @@
# simple_backup # simple_backup
## build ## Build
```sh ```sh
$ go build -o backup git.lhk.o-r.kr/freerer2/simple_backup/cmd $ go build -o backup git.lhk.o-r.kr/freerer2/simple_backup/cmd
``` ```
## Usage
```sh
사용법: backup <원본경로> <백업경로> [옵션]
옵션:
-g, --group-by 백업 폴더 구조 기준 (기본값: day)
가능한 값: year, mon, day, hour, min, sec
-i, --incremental 증분 백업 사용
기존 백업과 비교하여 변경된 파일만 백업
-c, --compare 파일 비교 방식 선택 (기본값: time)
- time: 파일 수정 시간으로 비교
- hash: 파일 내용의 해시값으로 비교
-d, --dry-run 실행하지 않고 어떤 파일이 복사되는지 출력
실제 파일 시스템을 변경하지 않음
-v, --verbose 복사 로그 자세히 출력
진행 상황과 세부 정보를 표시
-f, --force 속성 무시하고 무조건 덮어쓰기
기존 파일 존재 시 강제로 덮어씀
예시:
backup /source /simple_backup --group-by day --compare hash
backup /home/user/docs /simple_backup/docs -i -v
backup /data /simple_backup -d --force
```

파일 보기

@@ -2,6 +2,7 @@ package main
import ( import (
"context" "context"
"errors"
"flag" "flag"
"fmt" "fmt"
"os" "os"
@@ -45,12 +46,13 @@ func showHelp() {
-i, --incremental 증분 백업 사용 -i, --incremental 증분 백업 사용
기존 백업과 비교하여 변경된 파일만 백업 기존 백업과 비교하여 변경된 파일만 백업
(.backup_meta.json을 생성하여 이용함.)
-c, --compare 파일 비교 방식 선택 (기본값: time) -c, --compare 파일 비교 방식 선택 (기본값: time)
- time: 파일 수정 시간으로 비교 - time: 파일 수정 시간으로 비교
- hash: 파일 내용의 해시값으로 비교 - hash: 파일 내용의 해시값으로 비교
-d, --dry-run 하지 않고 어떤 파일이 복사되는지 출력 -d, --dry-run 하지 않고 어떤 파일이 복사되는지 출력
실제 파일 시스템을 변경하지 않음 실제 파일 시스템을 변경하지 않음
-v, --verbose 복사 로그 자세히 출력 -v, --verbose 복사 로그 자세히 출력
@@ -64,7 +66,7 @@ func showHelp() {
backup /home/user/docs /simple_backup/docs -i -v backup /home/user/docs /simple_backup/docs -i -v
backup /data /simple_backup -d --force backup /data /simple_backup -d --force
자세한 정보: https://github.com/yourusername/backup` 자세한 정보: https://git.lhk.o-r.kr/simple-utils/simple_backup`
fmt.Println(helpText) fmt.Println(helpText)
} }
@@ -246,7 +248,7 @@ func main() {
} }
if err := backup.RunBackup(ctx, opts.Src, backupPath, backupOpts); err != nil { if err := backup.RunBackup(ctx, opts.Src, backupPath, backupOpts); err != nil {
if err == context.Canceled { if errors.Is(err, context.Canceled) {
fmt.Println("\n백업이 취소되었습니다") fmt.Println("\n백업이 취소되었습니다")
} else { } else {
fmt.Println("\n백업 중 오류 발생:", err) fmt.Println("\n백업 중 오류 발생:", err)

파일 보기

@@ -106,7 +106,7 @@ func calculateFileHash(path string) (string, error) {
} }
func RunBackup(ctx context.Context, src, dst string, opts Options) error { func RunBackup(ctx context.Context, src, dst string, opts Options) error {
var backupF = false
if opts.dirCache == nil { if opts.dirCache == nil {
opts.dirCache = path.NewDirCache() opts.dirCache = path.NewDirCache()
} }
@@ -271,6 +271,7 @@ func RunBackup(ctx context.Context, src, dst string, opts Options) error {
progress.Status = "복사됨" progress.Status = "복사됨"
if opts.Progress != nil { if opts.Progress != nil {
backupF = true
opts.Progress(progress) opts.Progress(progress)
} }
} }
@@ -283,19 +284,27 @@ func RunBackup(ctx context.Context, src, dst string, opts Options) error {
} }
} }
entries, err := os.ReadDir(dst) if !opts.DryRun {
if err != nil { entries, err := os.ReadDir(dst)
return fmt.Errorf("디렉토리 읽기 실패: %w", err)
}
if len(entries) == 0 {
err := os.Remove(dst)
if err != nil { if err != nil {
return err return fmt.Errorf("디렉토리 읽기 실패: %w", err)
}
if len(entries) == 0 {
err := os.Remove(dst)
if err != nil {
return err
}
opts.Logger.Printf("백업된 내역이 없습니다.\n")
} else {
fmt.Println("백업이 성공적으로 완료되었습니다.")
} }
opts.Logger.Printf("백업된 내역이 없습니다.")
} else { } else {
fmt.Println("\n백업이 성공적으로 완료되었습니다") if backupF {
fmt.Println("백업이 성공적으로 완료되었습니다.")
} else {
opts.Logger.Printf("백업된 내역이 없습니다.\n")
}
} }
return nil return nil
} }