40

I can do df . to get some of the info on the mount that the current directory is in, and I can get all the info I want from mount. However, I get too much info (info about other mounts). I can grep it down, but I am wondering if there is a better way.

Is there some command mountinfo such that mountinfo . gives the info I want (like df . but with the info that mount gives)?


I am using Debian GNU/Linux.

3
  • 2
    I believe stat command can be used as well. However, I am not sure if %m option which gives the mount point is supported in your version of system. I checked in my system and it seemed to not return the mount point.
    – Ramesh
    Commented Aug 14, 2014 at 2:33
  • 4
    @Ramesh, Yes stat "--printf=%m\n" . gets the mount-point of the file-system that the current directory is in. Thus allowing us to simplify some of the answers. Thanks. Commented Aug 14, 2014 at 11:29

5 Answers 5

47

I think you want something like this:

findmnt -T .

When using the option

-T, --target path
if the path is not a mountpoint file or directory, findmnt checks path elements in reverse order to get the mountpoint. You can print only certain fields via -o, --output [list].
See findmnt --help for the list of available fields.


Alternatively, you could run:

(until findmnt . ; do cd .. ; done)

The problem you're running into is that all paths are relative to something or other, so you just have to walk the tree. Every time.

findmnt is a member of the util-linux package and has been for a few years now. By now, regardless of your distro, it should already be installed on your Linux machine if you also have the mount tool.

man mount | grep findmnt -B1 -m1
For  more robust and customizable output use
findmnt(8),  especially  in  your   scripts.

findmnt will print out all mounts' info without a mount-point argument, and only that for its argument with one. The -D is the emulate df option. Without -D its output is similar to mount's - but far more configurable. Try findmnt --help and see for yourself.

I stick it in a subshell so the current shell's current directory doesn't change.

So:

mkdir -p /tmp/1/2/3/4/5/6 && cd $_ 
(until findmnt . ; do cd .. ; done && findmnt -D .) && pwd

OUTPUT

TARGET SOURCE FSTYPE OPTIONS
/tmp   tmpfs  tmpfs  rw
SOURCE FSTYPE  SIZE   USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G 839.7M   11G   7% /tmp
/tmp/1/2/3/4/5/6

If you do not have the -D option available to you (Not in older versions of util-linux) then you need never fear - it is little more than a convenience switch in any case. Notice the column headings it produces for each call - you can include or exclude those for each invocation with the -output switch. I can get the same output as -D might provide like:

 findmnt /tmp -o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET

OUTPUT

SOURCE FSTYPE  SIZE  USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G  1.1G 10.6G  10% /tmp
14
  • I like it, except the bit about -D, I don't have that option. (I am on Debian7, util-linux 2.20.1-5.3) Commented Aug 12, 2014 at 10:32
  • I will √ you in a few days, I will leave some time to see if anyone has a more perfect answer. Though this is close to perfect (if it worked like df: did not need the loop, then it would be perfect). Commented Aug 12, 2014 at 10:36
  • 1
    Thanks to @ramesh we can also do findmnt $(stat "--printf=%m\n" .) Commented Aug 14, 2014 at 11:30
  • 2
    My version of findmnt has a -T option that can bypass the cd .. loop. Might be useful to someone else.
    – nitrogen
    Commented Jan 23, 2017 at 8:08
  • 1
    @nitrogen - yes. please make that an answer. that switch has been added since this was published, and possibly even as a result of its publishing.
    – mikeserv
    Commented Jan 23, 2017 at 9:46
3

I don't know of a command, but you could create a function. You can add the below to your .bashrc:

mountinfo () {
  mount | grep $(df -P "$1" | tail -n 1 | awk '{print $1}')
}

This executes the mount command and passes the output to grep. grep will look for the output of df -P "$1" | tail -n 1 | awk '{print $1}', and to break it down:

  • df -P "$1" will run df on the argument passed to the function,
  • tail -n 1 will only output the second line, the one that contains the partition info.
  • awk '{print $1}' will print the first part of that line, which is the disk/partition number, for example /dev/sda5. That's what grep will look for in the mount command, and output it.

Source your .bashrc file to apply the changes, or log out and log back in.

Now, if you run mountinfo ., you'll get the output you want.

1
  • This is pretty much what I have been doing (but without the function, I don't do it enough, when I do it is on other systems e.g. answers on this site. ), it is just that mount with no options seem a bit of an after thought: with options you create mount points, without it lists them, I was hoping for a better list tool. As we see @mikeserv has shown us findmnt. Commented Aug 13, 2014 at 13:29
1

The Linux/Unix way is to have a toolbox of small utilities that, when combined, give you the results that you're after.

They tend not to have an utility for every occassion. Instead you have many small useful utilities that are combined together with pipes etc. The advantage of this is that you can write your own utility quite easily if none are available.

For example, to get the info you're after, you could use:

mount | grep $(df  --output=source . | tail -1)

If you want to reuse the above with different directories, create a script:

#!/bin/bash
mount | grep $(df  --output=source $1 | tail -1)

Save it as mountinfo and make it executable (chmod +x mountinfo). You can then use it as:

mountinfo .

If you want a system that has an utility for everything none of which interoperate with each other, then a certain Mr Gates may be able to help you ;-)

2
  • --output only exists in very recent versions of GNU coreutils (≥8.22). Commented Aug 11, 2014 at 22:52
  • This is pretty much what I have been doing, it is just that mount with no options seem a bit of an after thought: with options you create mount points, without it lists them, I was hoping for a better list tool. As we see @mikeserv has shown us findmnt. Commented Aug 13, 2014 at 13:26
1

It can be somewhat messy if the mount points contain blanks, but this should work except in cases where the mount points contain newlines:

#!/bin/sh
mountpoint="$(df -P "$1" | awk '{
    if (NR==1)
        i=index($0,"Mounted on");
    else
        print substr($0,i);
    }')"
mount|grep " on ${mountpoint} type "

df -P outputs one line for the filesystem; without that option, df may output two lines if the mount point is long. The mount point name starts in the same column as does the "Mounted on" label in the header line.

After we get the mount point, we grep for it in the output of mount.

0

If you using a not completely ancient version of the GNU coreutils df, then echo $(df . --output=target | tail -n 1) works. Likewise with stat -c '%m' ., although I note that https://linux.die.net/man/1/stat lacks documentation of the %m format option.

Doing this portably is tiresome: neither of the above will work with the BSD or Cygwin versions of stat or df. If it weren't for the possibility of spaces in the paths of mount points, df -P . | tail -1 | awk '{ print $NF}' would be good, but often USB flash drives have spaces in the volume name, which will probably appear in the mount path and break this. For portability, Perl is installable practically everywhere and CPAN has the module Sys::Filesystem::MountPoint which provides the desired functionality.

2
  • Can you tell us what the echo $() adds to the command? Commented Dec 12, 2019 at 21:20
  • df -P . | tail -1 | awk '{ print $NF}' is the only command that worked on LibreELEC v11.0.3 Commented Nov 15, 2023 at 5:23

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .