Vendor the command set the menu and shell depend on
This commit is contained in:
Executable
+48
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
|
||||
# blob:summary=Pick a file from a menu
|
||||
# blob:group=menu
|
||||
# blob:name=file
|
||||
# blob:args=label paths formats [menu args...]
|
||||
# blob:examples=blob menu file "Select image" "$HOME/Pictures" "jpg png webp"|blob-menu-file "Select media" "$HOME/Pictures:$HOME/Videos" "jpg png mp4 mov" --width 800
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if (( $# < 3 )); then
|
||||
echo "Usage: blob-menu-file <label> <paths> <formats> [menu args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
label="$1"
|
||||
paths_arg="$2"
|
||||
formats_arg="$3"
|
||||
shift 3
|
||||
|
||||
IFS=: read -r -a paths <<<"$paths_arg"
|
||||
read -r -a formats <<<"$formats_arg"
|
||||
|
||||
if (( ${#paths[@]} == 0 || ${#formats[@]} == 0 )); then
|
||||
echo "Usage: blob-menu-file <label> <paths> <formats> [menu args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for path in "${paths[@]}"; do
|
||||
[[ -e $path ]] || { echo "Path not found: $path" >&2; exit 1; }
|
||||
done
|
||||
|
||||
find_args=("${paths[@]}" "(" -type d -name ".*" ! -name "." -prune ")" -o -type f ! -name ".*" "(")
|
||||
first_format=true
|
||||
for format in "${formats[@]}"; do
|
||||
if [[ $first_format == "true" ]]; then
|
||||
first_format=false
|
||||
else
|
||||
find_args+=(-o)
|
||||
fi
|
||||
|
||||
format="${format#.}"
|
||||
find_args+=(-iname "*.$format")
|
||||
done
|
||||
find_args+=(")" -printf '%T@\t%p\n')
|
||||
|
||||
find "${find_args[@]}" 2>/dev/null | sort -rn | cut -f2- |
|
||||
blob-menu-select "$label" -- --width 800 --maxheight 500 "$@"
|
||||
Reference in New Issue
Block a user