Add exclude option to find_duplicate_pictures.sh
This commit is contained in:
@@ -32,6 +32,9 @@ three independent checks:
|
|||||||
# Scan specific roots
|
# Scan specific roots
|
||||||
./find_duplicate_pictures.sh /home/user/Pictures /mnt/backup
|
./find_duplicate_pictures.sh /home/user/Pictures /mnt/backup
|
||||||
|
|
||||||
|
# Scan a collection while skipping cache and export directories
|
||||||
|
./find_duplicate_pictures.sh --exclude ~/Pictures/Cache --exclude ~/Pictures/Exports ~/Pictures
|
||||||
|
|
||||||
# Scan the whole filesystem (default when no arguments given)
|
# Scan the whole filesystem (default when no arguments given)
|
||||||
./find_duplicate_pictures.sh
|
./find_duplicate_pictures.sh
|
||||||
|
|
||||||
@@ -50,6 +53,16 @@ chmod +x find_duplicate_pictures.sh
|
|||||||
| `FOLLOW_LINKS` | `0` (off) | Set to `1` to follow symlinks while scanning |
|
| `FOLLOW_LINKS` | `0` (off) | Set to `1` to follow symlinks while scanning |
|
||||||
| `REPORT` | *(none)* | Path to a file where the full report is also saved |
|
| `REPORT` | *(none)* | Path to a file where the full report is also saved |
|
||||||
|
|
||||||
|
### Directory exclusions
|
||||||
|
|
||||||
|
Use `-x DIR` or `--exclude DIR` to skip a directory and all of its contents.
|
||||||
|
The option may be repeated and accepts paths containing spaces. Relative paths
|
||||||
|
are supported for both scan roots and exclusions.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./find_duplicate_pictures.sh -x ~/Pictures/Cache -x ~/Pictures/Exports ~/Pictures
|
||||||
|
```
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -14,18 +14,22 @@
|
|||||||
# pre-filter before hashing.
|
# pre-filter before hashing.
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# ./find_duplicate_pictures.sh [DIR ...]
|
# ./find_duplicate_pictures.sh [--exclude DIR ...] [DIR ...]
|
||||||
# ./find_duplicate_pictures.sh # defaults to "/" (whole system)
|
# ./find_duplicate_pictures.sh # defaults to "/" (whole system)
|
||||||
#
|
#
|
||||||
# Examples:
|
# Examples:
|
||||||
# ./find_duplicate_pictures.sh / /mnt/c /mnt/d
|
# ./find_duplicate_pictures.sh / /mnt/c /mnt/d
|
||||||
# ./find_duplicate_pictures.sh ~/Pictures
|
# ./find_duplicate_pictures.sh ~/Pictures
|
||||||
|
# ./find_duplicate_pictures.sh --exclude ~/Pictures/Cache ~/Pictures
|
||||||
#
|
#
|
||||||
# Options (environment variables):
|
# Options (environment variables):
|
||||||
# HASH_CMD=sha256sum # override hash tool (sha256sum, shasum -a 256, md5sum)
|
# HASH_CMD=sha256sum # override hash tool (sha256sum, shasum -a 256, md5sum)
|
||||||
# FOLLOW_LINKS=1 # follow symlinks while scanning (default: off)
|
# FOLLOW_LINKS=1 # follow symlinks while scanning (default: off)
|
||||||
# REPORT=report.txt # also write the report to a file
|
# REPORT=report.txt # also write the report to a file
|
||||||
#
|
#
|
||||||
|
# Options:
|
||||||
|
# -x, --exclude DIR # skip DIR and everything below it (repeatable)
|
||||||
|
#
|
||||||
|
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
@@ -82,12 +86,46 @@ build_ext_expr() {
|
|||||||
# Arguments / scan roots
|
# Arguments / scan roots
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
if [ "$#" -gt 0 ]; then
|
ROOTS=()
|
||||||
ROOTS=("$@")
|
EXCLUDE_DIRS=()
|
||||||
else
|
while [ "$#" -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
-x|--exclude)
|
||||||
|
if [ "$#" -lt 2 ]; then
|
||||||
|
echo "ERROR: $1 requires a directory path." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
EXCLUDE_DIRS+=("$2")
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
ROOTS+=("$@")
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
ROOTS+=("$1")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "${#ROOTS[@]}" -eq 0 ]; then
|
||||||
ROOTS=("/")
|
ROOTS=("/")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Use absolute paths because find emits paths relative to the supplied root.
|
||||||
|
for index in "${!ROOTS[@]}"; do
|
||||||
|
if [ -d "${ROOTS[$index]}" ]; then
|
||||||
|
ROOTS[$index]=$(cd "${ROOTS[$index]}" && pwd -P)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
for index in "${!EXCLUDE_DIRS[@]}"; do
|
||||||
|
if [ -d "${EXCLUDE_DIRS[$index]}" ]; then
|
||||||
|
EXCLUDE_DIRS[$index]=$(cd "${EXCLUDE_DIRS[$index]}" && pwd -P)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
FIND_LINK_FLAG=()
|
FIND_LINK_FLAG=()
|
||||||
if [ "${FOLLOW_LINKS:-0}" = "1" ]; then
|
if [ "${FOLLOW_LINKS:-0}" = "1" ]; then
|
||||||
FIND_LINK_FLAG=(-L)
|
FIND_LINK_FLAG=(-L)
|
||||||
@@ -98,6 +136,9 @@ PRUNE_EXPR=()
|
|||||||
for d in $PRUNE_DIRS; do
|
for d in $PRUNE_DIRS; do
|
||||||
PRUNE_EXPR+=( -path "$d" -prune -o )
|
PRUNE_EXPR+=( -path "$d" -prune -o )
|
||||||
done
|
done
|
||||||
|
for d in "${EXCLUDE_DIRS[@]}"; do
|
||||||
|
PRUNE_EXPR+=( -path "$d" -prune -o )
|
||||||
|
done
|
||||||
|
|
||||||
# Extension expression
|
# Extension expression
|
||||||
mapfile -t EXT_EXPR < <(build_ext_expr)
|
mapfile -t EXT_EXPR < <(build_ext_expr)
|
||||||
|
|||||||
Reference in New Issue
Block a user