-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathexif_drop.sh
More file actions
executable file
·135 lines (121 loc) · 3.91 KB
/
Copy pathexif_drop.sh
File metadata and controls
executable file
·135 lines (121 loc) · 3.91 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
#!/bin/sh
########################################################################
# exif_drop.sh: Remove EXIF Data from Images with GPS Information
#
# Description:
# This script searches for image files with GPS information in their
# EXIF data and removes this data using jhead for privacy reasons.
#
# 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:
# ./exif_drop.sh <directory_path>
#
# Options:
# -h Display this help message.
#
# Notes:
# - Ensure that the exiftool and jhead utilities are installed before running this script.
#
# Version History:
# v2.0 2026-08-22
# Replace read -d pathname processing with POSIX find -exec while
# preserving pathname safety.
# v1.9 2026-07-11
# Replace the awk {n,} interval expression in usage() with a portable
# equivalent, since mawk on some systems matches it incorrectly.
# v1.8 2025-08-03
# Improve file safety with null-terminated find output.
# Suppress exiftool stderr output on missing tags.
# Add validation for single argument constraint.
# 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-13
# Redirected error messages to stderr for better logging and debugging.
# v1.2 2024-08-11
# Added input validation to ensure directory is provided as an argument.
# Display help message if no arguments are provided.
# v1.1 2023-12-06
# Refactored for improved readability and added detailed comments.
# v1.0 2009-10-05
# Initial release.
#
########################################################################
FIND=find
EXIFTOOL=exiftool
JHEAD=jhead
# Display full script header information extracted from the top comment block
usage() {
awk '
BEGIN { in_header = 0 }
/^#+$/ && length($0) >= 10 { if (!in_header) { in_header = 1; next } else exit }
in_header && /^# ?/ { print substr($0, 3) }
' "$0"
exit 0
}
# Check if required commands are available and executable
check_commands() {
for cmd in "$@"; do
cmd_path=$(command -v "$cmd" 2>/dev/null)
if [ -z "$cmd_path" ]; then
echo "[ERROR] Command '$cmd' is not installed. Please install $cmd and try again." >&2
exit 127
elif [ ! -x "$cmd_path" ]; then
echo "[ERROR] Command '$cmd' is not executable. Please check the permissions." >&2
exit 126
fi
done
}
# Validate directory
check_directory() {
if [ ! -d "$1" ]; then
echo "[ERROR] '$1' is not a valid directory." >&2
exit 1
fi
}
# Process images and remove EXIF GPS data
process_images() {
dir="$1"
if [ "$#" -ne 1 ]; then
echo "[ERROR] Please specify exactly one directory." >&2
usage
fi
"$FIND" "$dir" -type f -exec sh -c '
exiftool=$1
jhead=$2
shift 2
for file do
if [ -n "$("$exiftool" -gps:GPSLatitude "$file" 2>/dev/null)" ]; then
"$jhead" -purejpg "$file"
echo "[INFO] Processed: $file"
else
echo "[INFO] Skipped: $file"
fi
done
' sh "$EXIFTOOL" "$JHEAD" {} +
}
# Main entry point of the script
main() {
case "$1" in
-h|--help|-v|--version) usage ;;
esac
if [ "$#" -eq 0 ]; then
usage
fi
directory="$1"
check_commands $EXIFTOOL $JHEAD $FIND
check_directory "$directory"
process_images "$directory"
return 0
}
# Execute main function
main "$@"