From 284f789aa2ae711e850ed85834ed13a8d9472511 Mon Sep 17 00:00:00 2001 From: xeruf <27jf@pm.me> Date: Fri, 21 Apr 2023 09:26:34 +0200 Subject: [PATCH] bin: improve umoul handling --- .config/shell/functions | 30 ++++++++--------- .local/bin/scripts/lowercase | 4 ++- .local/bin/scripts/moul | 64 +++++++++++++++++++----------------- 3 files changed, 51 insertions(+), 47 deletions(-) diff --git a/.config/shell/functions b/.config/shell/functions index a73b54e..3ecc937 100644 --- a/.config/shell/functions +++ b/.config/shell/functions @@ -504,16 +504,12 @@ else alias f1='find -mindepth 1 -maxdepth 1' fi -lowercase() { - #$(which perl-rename || echo rename) -iv 'y/A-Z /a-z-/' "$@" - find "$@" -exec sh -c 'mv -iv "{}" "$(echo "{}" | tr "A-Z " "a-z-" | sed "s|---|_|;s|\.-|.|")" 2>/dev/null' \; -} - # TODO replace cp by rsync, automatically use compression for remote transfers # rsync directory properly - suffix both dirs with / to act on contents alias rcn='rsync -v --recursive --human-readable --links --dry-run' rcd() { rcn --size-only "$@" | tail +2 | tree --fromfile . | less -F; } compdef rcd=rsync +# TODO do not sync times to FAT alias rc='rcs --links --hard-links --times' alias rcu='rc --existing --size-only' alias rcs='rsync --recursive --info=progress2,remove,symsafe,flist,del --human-readable' @@ -571,8 +567,8 @@ compdef mkcd=mkdir # Other stuff {{{1 alias unmount=umoul -# This is a function rather than a script as it potentially needs to cd out -# if the current directory is the one to unmount +# This is a function rather than a script as it needs to cd up +# if the current directory is to be unmounted umoul() { local arg local mnt="${MNT:-${XDG_RUNTIME_DIR}/mnt}" @@ -580,7 +576,7 @@ umoul() { for arg; do true; done case "$arg" in (-a|--all) - mountpoints=$(mount | grep "$mnt" | cut -d' ' -f3) + mountpoints="$(mount | grep "$mnt" | cut -d' ' -f3)";; ("") mountpoints="$(pwd | grep -v /home || echo /)" while test "$mountpoints" != "/"; do @@ -592,21 +588,23 @@ umoul() { grep --invert-match -e " /[^m][^/]*\(/[^/]*\)\? " -e "/sys" -e "/run/user" -e "/run/docker" -e "/home" | fzf --exit-0 | awk '{print $3}')" || return $? + ;; (*) mountpoints="$(test -d "$arg" && realpath "$arg" || echo "$mnt/$arg")" mountpoint "$mountpoints" 2>/dev/null || test -b "$mountpoints" || mountpoints="$(mount --show-labels | grep "$arg" | cut -d' ' -f3)" test "$mountpoints" || return 1 + ;; esac - while true; do - case "$PWD" in - ("$mountpoints"*) popd || builtin cd "$(dirname $mountpoints)";; - (*) break;; - esac - done # pass on all args except last - for mountpoint in $mountpoints - do moul -u "${@:1:$(((# > 1) ? #-1 : 0))}" "$mountpoint" + for mountpoint in $mountpoints; do + while true; do + case "$PWD" in + ("$mountpoint"*) popd || builtin cd "$(dirname "$mountpoint")";; + (*) break;; + esac + done + moul -u "${@:1:$(((# > 1) ? #-1 : 0))}" "$mountpoint" done } diff --git a/.local/bin/scripts/lowercase b/.local/bin/scripts/lowercase index ddcb37a..002a55b 100755 --- a/.local/bin/scripts/lowercase +++ b/.local/bin/scripts/lowercase @@ -1,3 +1,5 @@ #!/bin/sh # Lowercase given files -perl-rename 'y/A-Z /a-z-/' "$@" +#perl-rename 'y/A-Z /a-z-/' "$@" +#$(which perl-rename || echo rename) -iv 'y/A-Z /a-z-/' "$@" +find "$@" -exec sh -c 'mv -iv "{}" "$(echo "{}" | tr "A-Z " "a-z-" | sed "s|---|_|;s|\.-|.|")" 2>/dev/null' \; diff --git a/.local/bin/scripts/moul b/.local/bin/scripts/moul index 58d78ca..228bd2c 100755 --- a/.local/bin/scripts/moul +++ b/.local/bin/scripts/moul @@ -1,34 +1,37 @@ -#!/bin/sh -x +#!/bin/sh # Mount a partition by label or device identifier automatically # Includes interactive selection if no argument is given set -eo pipefail _help="$0 [mountpoint] [options...]" case $1 in - (-v) shift - bash -x "$0" "$@";; - ("") # TODO include size - arg=$( - { #for ip in $(sudo nmblookup -S \* | grep '^[0-9]' | cut -d' ' -f1) - #do timeout --kill-after=.1s .1s showmount --no-headers --exports "$ip" 2>/dev/null | sed "s|\([^ ]*\) .*|$ip:\1|" - #done & - lsblk --list --noheadings --output name,label,fstype,mountpoint | grep -v LUKS | grep -v '/' | grep ".\+ [^ ]\+"; } | fzf --exit-0 | - sed "s/^\([^ ]\+ \+\)\?\([^ ]\+\) \+[^ ]\+ *$/\2/");; - (--help) echo "$_help" && exit 0;; - (-u) shift - for last; do true; done - sudo umount --verbose "$@" - code=$? - sudo rm -df "$last" - exit $code;; - (*) arg=$1 - shift;; + (-v) shift + bash -x "$0" "$@";; + ("") # TODO include size + arg=$( + { + #for ip in $(sudo nmblookup -S \* | grep '^[0-9]' | cut -d' ' -f1) + #do timeout --kill-after=.1s .1s showmount --no-headers --exports "$ip" 2>/dev/null | sed "s|\([^ ]*\) .*|$ip:\1|" + #done & + # TODO handle labels with spaces + lsblk --list --noheadings --output name,label,fstype,mountpoint | grep -v LUKS | grep -v '/' | grep ".\+ [^ ]\+"; + } | fzf --exit-0 | sed "s/^\([^ ]\+ \+\)\?\([^ ]\+\) \+[^ ]\+ *$/\2/" + );; + (--help) echo "$_help" && exit 0;; + (-u) shift + for last; do true; done + sudo umount --verbose "$@" + code=$? + sudo rm -df "$last" + exit $code;; + (*) arg=$1 + shift;; esac # FSTAB: BY LABEL if grep --word-regexp "LABEL=$arg" /etc/fstab then # have to mount twice as the first one might be creating the directory - mount -L "$arg" "$@" 2>/dev/null || mount -L "$arg" "$@" - exit $? + mount -L "$arg" "$@" 2>/dev/null || mount -L "$arg" "$@" + exit $? fi # FSTAB: BY MOUNTPOINT/NAME if grep --word-regexp "$arg" /etc/fstab @@ -39,22 +42,23 @@ fi mountpoint="${2:-${MNT:-${XDG_RUNTIME_DIR}/mnt}/$(basename "$arg")}" if grep -e "[^\w=/]$mountpoint[^\w/]" /etc/fstab then test $# -gt 0 && shift - mount "$mountpoint" "$@" - code=$? - cd $mountpoint - exit $code + mount "$mountpoint" "$@" + code=$? + cd $mountpoint + exit $code fi case "$arg" in - (sd*|loop*|nvme*|mm*|md*|dm*|vg*) partition="/dev/$arg";; - (/dev/*) partition="$arg";; - (*) partition="-L $arg";; + (sd*|loop*|nvme*|mm*|md*|dm*|vg*) partition="/dev/$arg";; + (/dev/*) partition="$arg";; + (*) params="-L" + partition="$arg";; esac shift $(expr 2 \& $# \> 2 \| $#) #uid=$(id --user),gid=$(id --group), \ if ! mountpoint "$mountpoint" 2>/dev/null then mp="/run/media/$USER/$arg" && test -e "$mp" && mountpoint="$mp" - sudo mount -vo users,X-mount.mkdir,noatime,umask=003,gid=users,uid=$USER $partition $mountpoint "$@" || - sudo mount -vo users,X-mount.mkdir,noatime $partition $mountpoint "$@" + sudo mount -vo users,X-mount.mkdir,noatime,umask=003,gid=users,uid=$USER $params "$partition" "$mountpoint" "$@" || + sudo mount -vo users,X-mount.mkdir,noatime $params "$partition" "$mountpoint" "$@" fi cd $mountpoint exec $SHELL