-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathdashcam_sync.sh
executable file
·132 lines (118 loc) · 4.15 KB
/
dashcam_sync.sh
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
#!/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: LGPLv3 (Details: https://www.gnu.org/licenses/lgpl-3.0.html)
# Contact: [email protected]
#
# Version History:
# 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.
#
# 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.
#
########################################################################
# Determine the script's directory
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# Function to 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
}
# Function to 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
}
# Function to synchronize files using rsync
sync_files() {
echo "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
}
# Function to 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 "No files to move from $src."
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 function to execute the script
main() {
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 "Operation completed successfully."
}
# Execute main function
main "$@"