sistema_progs

Programas para customizar o meu entorno de traballo nos meus equipos persoais
Log | Files | Refs

umounttree (1856B)


      1 #!/usr/bin/env sh
      2 
      3 # Description: Autodetects a nnn remote mountpoint (mounted with `c`)
      4 #              from any of its subfolders and allows unmounting it
      5 #              from the subdir without navigating to the mountppoint
      6 #              or entering the remote name. Also works when hovering
      7 #              the mountpoint directly like vanilla `u`.
      8 #
      9 # Dependencies: fusermount
     10 #
     11 # Shell: POSIX compliant
     12 # Authors: Kabouik & 0xACE
     13 #
     14 # TODO:
     15 # - Avoid lazy unmount by forcing nnn context to leave the subfolder before fusermount.
     16 #   Tried `printf "%s" "0c$m" > "$NNN_PIPE"` but it breaks the nnn interface, see #854.
     17 
     18 err=0
     19 m=$HOME/.config/nnn/mounts
     20 if [ "$PWD" = "$m" ]; then
     21     # Allow running the script on hovered directory if user is in ~/.config/nnn/mounts
     22     d="$1"
     23 else
     24     d=$(dirname "$(readlink -f "$1")" | grep -oP "^$m\K.*" | cut -d"/" -f2)
     25 fi
     26 
     27 # Test if user is within $m or a subdir, abort if not
     28 if [ "$d" = "" ]; then
     29     clear && printf "You are not in a remote folder mounted with nnn. Press return to continue. " && read -r _
     30 else
     31     # Test if $m/$d is a mountpoint and try unmounting if it is
     32     mountpoint -q -- "$m/$d"
     33     if [ "$?" -eq "1" ]; then
     34         clear && printf "Parent '%s' is not a mountpoint. Press return to continue. " "$d" && read -r _
     35     else
     36         cd "$m" && fusermount -uq "$m/$d" || err=1
     37         if [ "$err" -eq "0" ]; then
     38             rmdir "$m/$d" && clear && printf "Parent '%s' unmounted." "$d"
     39         else
     40             clear && printf "Failed to unmount. Try lazy unmount? [Yy/Nn] " && read -r
     41         fi
     42     fi
     43 fi
     44 
     45 # If unmount fails, offer lazy unmount
     46 if [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ]; then
     47     err=0
     48     cd "$m" && fusermount -uqz "$m/$d" || err=1
     49     if [ "$err" -eq "0" ]; then
     50         rmdir "$m/$d" && clear && printf "Parent '%s' unmounted with lazy unmount. " "$d"
     51     fi
     52 fi