Wednesday, November 17, 2021

[SOLVED] Mountpoint from a filename - portable way

Issue

Want make a script (called getmpoint) what will return the mountpoint from ANY filename.

The 1st idea, like: parsing output form the df or parsing fstab is not as easy as seems, because for example:

getmpoint ../../../some/path/tmp/somefile
getmpoint /tmp/somesymlink   #and want get the mountpoint where the real file is
getmpoint /

I have some idea by using stat (getting the device) - but i'm lost. Need some pointers how to solve this.

Another question is than the stat command is different on Freebsd-stat and Linux-stat. Is here any portable way?

Similarly, what about:

getmpoint /some/real/path/up/to/here/but/nonexistent_file

would be nice to get a mountpoint only from the path - without the file existence - so without stat.

Any advices? (I'm probably able make a script myself - but need some guide how to do ...)


Solution

Try this:

getmpoint.sh, expects the filenames as param

#!/bin/bash

for path
do
    orig=$path

    #find the existing path component
    while [ ! -e "$path" ]
    do
        path=$(dirname "$path")
    done

    #get a real file from a symlink
    [ -L "$path" ] && path=$(readlink "$path")

    # use "portable" (df -P)  - to get all informatons
    # 512-blocks      Used Available Capacity  Mounted on
    read s512 used avail capa mounted <<< $(df -P "$path" | awk '{if(NR==2){ print $2, $3, $4, $5, $6}}')

    echo "Filename: $orig"
    echo "Mounted: $mounted"
    echo "Available blocks: $avail"
done


Answered By - hek2mgl