#!/usr/bin/env sh USAGE="ssync-index [options] ROOT_DIR OPTIONS -b index basename only -k KEY_FILE (optional: if indexing local) ssh-key file to use (needs to be non-interactive) optional: will use default session key or key set in ssh_config for HOST -o OUTPUT_FILE -r REMOTE_HOST (optional) remote host to index from such as user@hostname username can be omitted if identical to $USER or if set in ssh_config -v verbose logging -w NUM_SECONDS index all files newer than NOW - NUM_SECONDS -h print this message" # HELPER METHODS verbose_log() { if [ ! -z "$VERBOSE_FLAG" ]; then echo "$1" fi } lines() { wc -l $1 | cut -d' ' -f1 } # GLOBAL VALUES BASENAME_ONLY_FLAG= KEY_FILE_FLAG= KEY_FILE_ARG= OUTPUT_FILE_FLAG= OUTPUT_FILE_ARG= REMOTE_HOST_FLAG= REMOTE_HOST_ARG= WINDOW_FLAG= WINDOW_ARG= VERBOSE_FLAG= # OPTIONS PARSING while getopts "hvbr:k:o:w:" opt; do case "${opt}" in h) echo "$USAGE" exit 1 ;; b) BASENAME_ONLY_FLAG=1 ;; k) KEY_FILE_FLAG=1 KEY_FILE_ARG="$OPTARG" ;; o) OUTPUT_FILE_FLAG=1 OUTPUT_FILE_ARG="$OPTARG" ;; r) REMOTE_HOST_FLAG=1 REMOTE_HOST_ARG="$OPTARG" ;; v) VERBOSE_FLAG=1 ;; w) WINDOW_FLAG=1 WINDOW_ARG="$OPTARG" ;; esac done shift $(($OPTIND -1)) if [ $# -ne 1 ]; then echo "$USAGE" exit 1 fi # ROOT_DIR validation ROOT_DIR=$1 if [ -z "$ROOT_DIR" ]; then echo "ROOT_DIR is missing." exit 1 fi if [ -z "$REMOTE_HOST_ARG" ]; then # local so check if directory exists if [ ! -d "$ROOT_DIR" ]; then echo "$ROOT_DIR does not exist." exit 1 fi fi # Option Validation if [ -z "$OUTPUT_FILE_FLAG" ]; then echo "-o output file required" exit 1 fi keyfile_cmd="" if [ ! -z "$KEY_FILE_FLAG" ]; then if [ ! -f "$KEY_FILE_ARG" ]; then echo "Identity file '$KEY_FILE_ARG' does not exist" exit 1 fi keyfile_cmd="-i $KEY_FILE_ARG" fi windowing_flag="" if [ ! -z "$WINDOW_FLAG" ]; then if [ "$WINDOW_ARG" -gt 0 ]; then newermt=$(date -d "$WINDOW_ARG seconds ago" -u -Is) windowing_flag="-newermt $newermt" verbose_log "Targetting files from $WINDOW_ARG seconds ago: $newermt" else echo "Invalid window value: $WINDOW_ARG" exit 1 fi fi index_value_cmd= if [ ! -z "$BASENAME_ONLY_FLAG" ]; then index_value_cmd="basename {}" else index_value_cmd="realpath {}" fi if [ -z "$REMOTE_HOST_FLAG" ]; then verbose_log "Generate local index from ${ROOT_DIR} to ${OUTPUT_FILE_ARG}" find ${ROOT_DIR} -type f ${windowing_flag} -exec ${index_value_cmd} \; > $OUTPUT_FILE_ARG verbose_log "Indexed $(lines $OUTPUT_FILE_ARG) files" else verbose_log "Generate remote index from $REMOTE_HOST_ARG:${ROOT_DIR} to ${OUTPUT_FILE_ARG}" ssh $keyfile_cmd $REMOTE_HOST_ARG \ "find ${ROOT_DIR} -type f ${windowing_flag} -exec ${index_value_cmd} \;" > $OUTPUT_FILE_ARG verbose_log "Indexed $(lines $OUTPUT_FILE_ARG) files" fi