1
1
Разклонения 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
1.9 KiB

преди 6 години
#!/usr/bin/env bash
преди 6 години
преди 6 години
declare -r esc=$'\033'
declare -r c_reset="${esc}[0m"
declare -r c_red="${esc}[31m"
преди 6 години
declare dryrun verbose
set -e
преди 6 години
err() {
преди 6 години
printf "${c_red}%s${c_reset}\n" "$*" >&2
преди 6 години
}
die() {
exit 1
}
has() {
преди 6 години
local verbose=0
преди 6 години
if [[ $1 == '-v' ]]; then
преди 6 години
verbose=1
преди 6 години
shift
fi
преди 6 години
for c; do c="${c%% *}"
преди 6 години
if ! command -v "$c" &> /dev/null; then
преди 6 години
(( verbose > 0 )) && err "$c not found"
преди 6 години
return 1
fi
done
}
has -v fzf || die
fzf() {
command fzf --cycle "$@"
}
pick_files() {
local files fzpick
преди 4 години
find . -maxdepth 1 2> /dev/null |
sort -h |
sed '1d; s|^\./||' |
while read -r f; do
if [[ -d "$f" ]]; then
printf '%s/\n' "$f"
elif [[ -L "$f" ]]; then
printf '%s@\n' "$f"
else
printf '%s\n' "$f"
fi
done |
fzf --multi --header='move these files' || return 1
преди 6 години
}
pick_destination() {
преди 6 години
local cwd browse_dir browse_info query dirs
преди 6 години
cwd=$(pwd)
преди 6 години
while [[ "$browse_dir" != "$cwd" ]]; do
mapfile -t browse_info < <(
преди 4 години
{ echo '..'; find . -maxdepth 1 -type d 2> /dev/null; } |
sed 's|^./||' |
sort -h |
преди 6 години
fzf --print-query \
--history="${HOME}/.cache/fzmv_history" \
преди 4 години
--header="${errors:-move files here}")
преди 6 години
query=${browse_info[0]}
browse_dir=${browse_info[1]}
преди 4 години
files=( "${browse_info[@]:2}" )
преди 6 години
[[ -d "$query" ]] && browse_dir="$query"
[[ ! -d "$browse_dir" ]] && return 1
if [[ "$browse_dir" == '.' && $(realpath "$browse_dir") != "$cwd" ]]; then
realpath "$browse_dir"
преди 6 години
break
else
преди 6 години
cd "$browse_dir" || die
преди 6 години
continue
fi
done
}
while (( $# > 0 )); do
case $1 in
-t|--test) dryrun=true ;;
преди 6 години
-v|--verbose) verbose=1 ;;
преди 6 години
esac
shift
done
mapfile -t files < <(pick_files)
(( ${#files[@]} > 0 )) || exit 1
destination=$(pick_destination) || exit 1
преди 6 години
${dryrun:+echo} mv ${verbose:+-v} -t "$destination" "${files[@]}"