Recursively Remove Mount Points
Posted: Sun Feb 28, 2021 9:56 pm
I wrote a script to recursively remove mount points based on code from my previous post:
"Get the Original Mount Point (i.e. exclude binds)"
Currently the input is hard coded (e.g. "PATTERN=('^/mnt/cont')" but it wouldn't be hard to modify it to accept input arguments:
Code: Select all
#!/bin/bash
PATTERN=('^/mnt/cont') #Make this an array so that you can specify extra grep options.
REMOVE=true
awk_fn='
function get_mnt_id(mnt_pt,loop){
if (length(mnt_pt) > 0 && length(loop)>0){
cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | grep " mnt_pt " | head -n 1"
} else if (length(mnt_pt) > 0){
cmd="cat /proc/self/mountinfo | sort | grep '" mnt_pt "' | head -n 1"
} else if (length(loop)>0){
cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | head -n 1"
}
while ((cmd | getline )){
mnt_id=$1
break
}
close(cmd)
return mnt_id
}
{
mnt_pt=$1
loop=$2
mnt_id=get_mnt_id(mnt_pt,loop)
print mnt_id "|" mnt_pt "|" loop
}'
TEMP="$(mktemp -p /tmp fndmnt_XXXX)"
findmnt -o TARGET,SOURCE -D -n | grep ${PATTERN[@]} | awk "$awk_fn" | sort -t '|' -r -k1 | cut -d'|' -f2 | tee "$TEMP"
while read a_mnt_pt; do
umount -l "$a_mnt_pt"
sleep 2
if [ ! "$(ls -A "$a_mnt_pt")" ] && [ "$REMOVE" = true ]; then
rmdir "$a_mnt_pt"
fi
done <"$TEMP"
One might want to incorporate this as a feature in puppy where you can right-click on a folder and recursively remove all mount points.