#! /bin/bash declare -a paths declare -i n=0 read_command() { local char read -rsn 1 char case "$char" in q | Q) echo 'CMD_QUIT';; h | H) echo 'CMD_MOVE_BACK';; l | L) echo 'CMD_MOVE_FORWARD';; f | F) echo 'CMD_FAVORITE';; *) echo 'CMD_UKNOWN';; esac } paths_find() { local -r root_dir="$1" local path IFS=$'\n' for path in $(find "$root_dir" -type f) do if file "$path" | grep 'image data' > /dev/null then (( n++ )) # \r jumps to the beginning of the line: printf '\rFound %d images.' "$n" >&2 paths["$n"]="$path" fi done unset IFS printf '\n' >&2 } paths_preview() { local -i i local path for ((i=1; i<=n; i++)) do path="${paths[$i]}" printf '%d of %d : %s\n' "$i" "$n" "$path" feh --bg-scale "$path" case "$(read_command)" in CMD_QUIT) exit 0;; CMD_MOVE_BACK) # TODO Cycle around. # One step further back than needed, # to correct for the upcoming i++. ((i = i - 2)) if [[ i -lt 0 ]]; then i=-1 fi;; CMD_MOVE_FORWARD) ;; CMD_FAVORITE) wallpaper_fav ((i--));; CMD_UKNOWN) # Remain ((i--));; esac done } main() { local root_dir case "$1" in '') root_dir="$DIR_WALLPAPERS";; *) root_dir="$1";; esac paths_find "$root_dir" paths_preview } main "$@"