diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2026-05-06 08:30:49 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2026-05-06 08:30:49 +0200 |
| commit | 60052659b98832c78c902e4f27ecee2663d8e913 (patch) | |
| tree | 9efc1388569c43456557aa1975b4bec99bf06c94 /scripts/sel | |
| parent | 10e16c2fb2266bb2b46ec7ea64d721de0c29a0d9 (diff) | |
| download | config-60052659b98832c78c902e4f27ecee2663d8e913.tar.gz config-60052659b98832c78c902e4f27ecee2663d8e913.zip | |
Added scripts
Diffstat (limited to '')
| -rwxr-xr-x | scripts/sel | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/scripts/sel b/scripts/sel new file mode 100755 index 0000000..6ecf4fe --- /dev/null +++ b/scripts/sel | |||
| @@ -0,0 +1,136 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | |||
| 3 | # Allow bulk operations on a list of selected files. | ||
| 4 | |||
| 5 | # Requires: dmenu (or similar), trash (optional), open-file (for open only) | ||
| 6 | |||
| 7 | # Usage: sel [-m menu] [command] | ||
| 8 | # If no command is specified, shows the list of selected files | ||
| 9 | # Commands: | ||
| 10 | # add [files...]: add files to selection | ||
| 11 | # addall: add all files in the current folder to selection | ||
| 12 | # clear: clear selection | ||
| 13 | # cp: copy to current dir, possbily after editing filenames | ||
| 14 | # edit: open selection in editor | ||
| 15 | # mv: move to current dir, possbily after editing filenames | ||
| 16 | # open: open files using open-file | ||
| 17 | # rm: remove selected files and clear selection | ||
| 18 | |||
| 19 | # TODO: The usage of paste(1) is a bit of a hack, and for example it does | ||
| 20 | # not work if filenames contain tab characters. Fix this. | ||
| 21 | |||
| 22 | # Bug (probably not fixing this, use virename): moving a file to | ||
| 23 | # itself gives an error and rm is not run. | ||
| 24 | |||
| 25 | file="$XDG_DATA_HOME/selectedfiles" | ||
| 26 | menu="" # default uses dmenu-filepicker default | ||
| 27 | editor=${EDITOR:-vi} | ||
| 28 | rm="trash rm" # replace with rm -r if you don't use trash | ||
| 29 | |||
| 30 | usage() { | ||
| 31 | echo "Usage: sel [-m MENU] [COMMAND]" | ||
| 32 | echo "If no COMMAND is specified, shows the list of selected files" | ||
| 33 | echo "Possible commands:" | ||
| 34 | echo " add [files...]: add files to selection" | ||
| 35 | echo " addall: add all files in the current folder to selection" | ||
| 36 | echo " clear: clear selection" | ||
| 37 | echo " cp: copy to current dir, possbily after editing filenames" | ||
| 38 | echo " edit: open selection in editor" | ||
| 39 | echo " mv: move to current dir, possbily after editing filenames" | ||
| 40 | echo " open: open files using open-file" | ||
| 41 | echo " rm: remove selected files and clear selection" | ||
| 42 | } | ||
| 43 | |||
| 44 | while getopts "m:" opt; do | ||
| 45 | case "$opt" in | ||
| 46 | m) | ||
| 47 | menu="$OPTARG" | ||
| 48 | ;; | ||
| 49 | *) | ||
| 50 | usage | ||
| 51 | exit 1 | ||
| 52 | ;; | ||
| 53 | esac | ||
| 54 | done | ||
| 55 | shift $((OPTIND - 1)) | ||
| 56 | |||
| 57 | add() { | ||
| 58 | shift 1 | ||
| 59 | if [ -z "$1" ]; then | ||
| 60 | if [ -n "$menu" ]; then | ||
| 61 | dmenu-filepicker -m "$menu" >> "$file" | ||
| 62 | else | ||
| 63 | dmenu-filepicker >> "$file" | ||
| 64 | fi | ||
| 65 | else | ||
| 66 | for i in "$@"; do realpath "$i" >> "$file"; done | ||
| 67 | fi | ||
| 68 | sort -u -o "$file" "$file" | ||
| 69 | } | ||
| 70 | |||
| 71 | clear() { | ||
| 72 | cat /dev/null > "$file" | ||
| 73 | } | ||
| 74 | |||
| 75 | cphere() { | ||
| 76 | file2=$(mktemp) | ||
| 77 | sed 's/^.*\///' "$file" > "$file2" | ||
| 78 | $editor "$file2" | ||
| 79 | if [ "$(wc -l "$file" | awk '{print $1}')" != \ | ||
| 80 | "$(wc -l "$file2" | awk '{print $1}')" ]; then | ||
| 81 | echo "Error reading new file names" | ||
| 82 | return 1 | ||
| 83 | else | ||
| 84 | paste "$file" "$file2" | while read -r f; do | ||
| 85 | fold=$(echo "$f" | sed 's/ .*//') | ||
| 86 | fnew=$(echo "$f" | sed 's/.* //') | ||
| 87 | cp -R "$fold" ./"$fnew" || return 1 | ||
| 88 | done | ||
| 89 | fi | ||
| 90 | } | ||
| 91 | |||
| 92 | open() { | ||
| 93 | while read -r f; do | ||
| 94 | open-file "$f" | ||
| 95 | done < "$file" | ||
| 96 | } | ||
| 97 | |||
| 98 | remove() { | ||
| 99 | while read -r f; do | ||
| 100 | $rm "$f" | ||
| 101 | done < "$file" | ||
| 102 | } | ||
| 103 | |||
| 104 | if [ -z "$1" ]; then | ||
| 105 | cat "$file" | ||
| 106 | else | ||
| 107 | case "$1" in | ||
| 108 | add) | ||
| 109 | add "$@" | ||
| 110 | ;; | ||
| 111 | addall) | ||
| 112 | add ./* | ||
| 113 | ;; | ||
| 114 | clear) | ||
| 115 | clear | ||
| 116 | ;; | ||
| 117 | cp) | ||
| 118 | cphere && clear | ||
| 119 | ;; | ||
| 120 | edit) | ||
| 121 | $editor "$file" | ||
| 122 | ;; | ||
| 123 | mv) | ||
| 124 | cphere && (remove; clear) | ||
| 125 | ;; | ||
| 126 | open) | ||
| 127 | open | ||
| 128 | ;; | ||
| 129 | rm) | ||
| 130 | remove && clear | ||
| 131 | ;; | ||
| 132 | *) | ||
| 133 | echo "$1: not a valid sel command" | ||
| 134 | ;; | ||
| 135 | esac | ||
| 136 | fi | ||
