-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathdashcam_sync.sh
More file actions
executable file
·153 lines (137 loc) · 4.78 KB
/
dashcam_sync.sh
File metadata and controls
executable file
·153 lines (137 loc) · 4.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/sh
########################################################################
# dashcam_sync.sh: Dashcam Files Management Script
#
# Description:
# This script synchronizes dashcam files from a local directory to an
# external drive and organizes them into a yearly structured folder. It
# requires a configuration file named 'dashcam_sync.conf' for specifying
# source and destination directories.
#
# Author: id774 (More info: http://id774.net)
# Source Code: https://github.com/id774/scripts
# License: The GPL version 3, or LGPL version 3 (Dual License).
# Contact: idnanashi@gmail.com
#
# Usage:
# Run the script without any arguments. Ensure that 'dashcam_sync.conf'
# is properly set up with SOURCE_DIR and DEST_DIR variables.
# ./dashcam_sync.sh
#
# Configuration file ('dashcam_sync.conf') requirements:
# - SOURCE_DIR: Directory containing the dashcam files to be synchronized.
# - DEST_DIR: Destination directory on the external drive for synchronized files.
# Ensure both variables are set in 'dashcam_sync.conf'.
#
# Notes:
# - Both source and destination directories must exist and be writable.
# - Files are first synced to a 'daily' subdirectory, then moved to a yearly directory.
#
# Error Conditions:
# 1. Source or destination directory does not exist.
# 2. Rsync operation failed.
# 3. Moving files failed.
# 4. Configuration file not found.
# 5. One or more configuration variables not set.
#
# Version History:
# v1.7 2025-06-23
# Unified usage output to display full script header and support common help/version options.
# v1.6 2025-04-13
# Unify log level formatting using [INFO], [WARN], and [ERROR] tags.
# v1.5 2025-03-22
# Unify usage information by extracting help text from header comments.
# v1.4 2025-03-17
# Encapsulated all logic into functions and introduced main function.
# v1.3 2025-03-16
# Redirected error messages to stderr for better logging and debugging.
# Make POSIX compliant by removing 'local' variables.
# v1.2 2024-02-08
# Enhanced documentation, added configuration variable checks, and
# improved error handling and script structure.
# v1.1 2023-12-23
# Updated to load source and destination directories from an external
# configuration file located in 'etc' or '../etc'.
# Added file existence check in move_files function to prevent errors
# when no files are available to move.
# v1.0 2023-12-05
# Initial release. Adds directory checks, error handling, and
# improves script reusability.
#
########################################################################
# Display full script header information extracted from the top comment block
usage() {
awk '
BEGIN { in_header = 0 }
/^#{10,}$/ { if (!in_header) { in_header = 1; next } else exit }
in_header && /^# ?/ { print substr($0, 3) }
' "$0"
exit 0
}
# Determine the script's directory
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# Load configuration
load_configuration() {
CONF_FILE="$SCRIPT_DIR/etc/dashcam_sync.conf"
if [ ! -f "$CONF_FILE" ]; then
CONF_FILE="$SCRIPT_DIR/../etc/dashcam_sync.conf"
if [ ! -f "$CONF_FILE" ]; then
echo "[ERROR] Configuration file not found." >&2
exit 4
fi
fi
. "$CONF_FILE"
# Check if necessary variables are set
if [ -z "$SOURCE_DIR" ] || [ -z "$DEST_DIR" ]; then
echo "[ERROR] SOURCE_DIR or DEST_DIR not set in configuration." >&2
exit 5
fi
}
# Check if source and destination directories exist
check_directories() {
if [ ! -d "$SOURCE_DIR" ] || [ ! -d "$DEST_DIR" ]; then
echo "[ERROR] Source or destination directory does not exist." >&2
exit 1
fi
}
# Synchronize files using rsync
sync_files() {
echo "[INFO] Synchronizing files to $DEST_DIR..."
rsync -avz --delete "$SOURCE_DIR/" "$DEST_DIR/daily/"
if [ $? -ne 0 ]; then
echo "[ERROR] Rsync failed." >&2
exit 2
fi
}
# Move files to a yearly directory
move_files() {
src="$1"
dest="$2"
# Check if there are files to move
if [ -z "$(find "$src" -type f | head -n 1)" ]; then
echo "[WARN] No files to move from $src." >&2
return 0
fi
echo "Moving files from '$src' to '$dest'..."
mv "$src"/* "$dest/" 2>/dev/null
if [ $? -ne 0 ]; then
echo "[ERROR] Moving files failed." >&2
exit 3
fi
}
# Main entry point of the script
main() {
case "$1" in
-h|--help|-v|--version) usage ;;
esac
load_configuration
check_directories
YEAR_DIR="$(date +"%Y")"
sync_files
move_files "$DEST_DIR/daily" "$DEST_DIR/$YEAR_DIR"
move_files "$SOURCE_DIR" "$SOURCE_DIR/../$YEAR_DIR"
echo "[INFO] Operation completed successfully."
return 0
}
# Execute main function
main "$@"