#!/bin/sh # Allow bulk operations on a list of selected files. # Usage: sel [command] # If no command is specified, shows the list of selected files # Commands: # add [files|dirs|all]: add files to selection # clear: clear selection # cp: copy to current dir, possbily after editing filenames # edit: open selection in editor # mv: move to current dir, possbily after editing filenames # open: open files using open-file # rm: remove selected files and clear selection # Requires: dmenu (or similar), trashrm (optional), open-file (for open only) # TODO: add possibility of specifying file. # TODO 2: The usage of paste(1) is a bit of a hack, and for example it does # not work if filenames contain tab characters. Fix this. file="$XDG_DATA_HOME/selectedfiles" menu=${MENU:-dmenu} editor=${EDITOR:-vi} rm=trashrm # replace with rm -r if you don't use trashrm add() { if [ -z "$2" ]; then dmenu-filepicker >> "$file" else case "$2" in files) ls | while read f; do [ -f "$f" ] && echo "$PWD/$f" >> "$file" done ;; dirs) ls | while read f; do [ -d "$f" ] && echo "$PWD/$f" >> "$file" done ;; all) ls | while read f; do echo "$PWD/$f" >> "$file" done ;; *) echo "$2: not a valid option" ;; esac fi } clear() { cat /dev/null > "$file" } cphere() { file2=$(mktemp) sed 's/^.*\///' "$file" > "$file2" $editor "$file2" if [ "$(wc -l $file | awk '{print $1}')" != \ "$(wc -l $file2 | awk '{print $1}')" ]; then echo "Error reading new file names" return 1 else paste "$file" "$file2" | while read f; do fold=$(echo "$f" | sed 's/\t.*//') fnew=$(echo "$f" | sed 's/.*\t//') cp -R "$fold" ./"$fnew" done return 0 fi } open() { while read f; do open-file "$f" done < "$file" } remove() { while read f; do $rm "$f" done < "$file" } if [ -z "$1" ]; then cat "$file" else case "$1" in add) add $@ sort -u -o "$file" "$file" ;; clear) clear ;; cp) cphere && clear ;; edit) $editor "$file" ;; mv) cphere && (remove; clear) ;; open) open ;; rm) remove && clear ;; *) echo "$1: not a valid sel command" ;; esac fi