#!/usr/bin/env bash show_help() { cat <<-EOF Usage: $(basename "$0") [OPTIONS] [COMMAND...] Finds directories inside ROOT_DIR that were modified before DATE and executes provided COMMAND inside each of them. Just lists directories if COMMAND is not provied. Options: -h Show help -v Verbose output DATE formats: Accepts any date format understood by the 'date' command. Examples: 2025-10-05 "2025-10-05 12:00" "Oct 5 2025" "yesterday" "2 weeks ago" Examples: $(basename "$0") /var/log 2025-10-05 $(basename "$0") /tmp "2025-10-05 18:00" pwd EOF } VERBOSE=0 while getopts "hv" opt; do case $opt in h) show_help exit 0 ;; v) VERBOSE=1 ;; *) echo "Unknown arguments, use -h for help." exit 1 ;; esac done shift $((OPTIND - 1)) show_error() { echo $* >&2 echo "Use -h for help..." } log() { if [[ "$VERBOSE" -eq 1 ]]; then echo $* fi } MIN_ARGS=2 if [ $# -lt $MIN_ARGS ]; then show_error "Not enough arguments! Expected $MIN_ARGS, got $#" exit 2 fi ROOT_DIR="$1" DATE_STR="$2" if [[ ! -d "$ROOT_DIR" ]]; then show_error "Provided ROOT_DIR (\"$ROOT_DIR\") does not exist!" exit 2 fi log "Provided ROOT_DIR: $ROOT_DIR" if ! date -d "$DATE_STR" >/dev/null 2>&1; then show_error "Invalid date!" exit 2 fi DATE=$(date -d "$DATE_STR" +%FT%T) log "Provided DATE: $DATE_STR" log "Parsed date: $DATE" shift 2 COMMAND="$*" log "Provided COMMAND: $COMMAND" FIND_CMD=(find "$ROOT_DIR" -type d ! -newermt "$DATE") if [[ -n "$COMMAND" ]]; then #FIND_CMD+=(-exec $COMMAND \;) FIND_CMD+=(-exec bash -c "cd '{}' && $COMMAND" \;) fi log "Final command: ${FIND_CMD[*]}" "${FIND_CMD[@]}"