当前目录的安装信息


20

我可以df .获取当前目录所在的挂载上的一些信息,并且可以从中获取所需的所有信息mount,但是可以获取很多信息(有关其他挂载的信息)。我可以将其保留下来,但想知道是否有更好的方法。

是否有一些命令mountinfo可以mountinfo .提供我想要的信息(例如df .,但提供了所需的信息mount。)


我正在使用Debian Gnu + Linux。


1
我相信stat命令也可以使用。但是,我不确定%m您的系统版本是否支持提供安装点的选项。我检查了系统,似乎没有返回安装点。
拉梅什(Ramesh)2014年

1
@Ramesh,是,它stat "--printf=%m\n" .获取当前目录所在的文件系统的挂载点。因此,我们可以简化一些答案。谢谢。
ctrl-alt-delor 2014年

Answers:


18

我想你想要这样的东西:

findmnt -T .

使用选件时

-T,-目标路径
如果路径不是安装点文件或目录,则以findmnt相反的顺序检查路径元素以获取安装点。您只能通过来打印某些字段-o, --output [list]
请参阅findmnt --help以获取可用字段列表。


或者,您可以运行:

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

您遇到的问题是,所有路径都相对于某物或其他路径,因此您只需走树即可。每次。

findmnt是util-linux软件包的成员,并且已经存在了几年。到目前为止,无论您使用的是哪个发行版,如果您也拥有该mount工具,都应该已经在Linux机器上安装了该工具。

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

findmnt会打印出所有不带挂载点参数的挂载信息,而只显示带挂载点参数的信息。该-D效仿df选项。没有-D它的输出类似于mount的-但可配置得多。尝试findmnt --help并亲自看看。

我将其粘贴在子shell中,因此当前shell的当前目录不会更改。

所以:

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

输出值

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

如果您没有-D可用的选项(在util-linux的较早版本中不是),则不必担心-在任何情况下,它都只是一个便利开关。请注意,它为每个调用生成的列标题-您可以使用-output开关包含或排除每次调用的列标题。我可以得到与-D可能提供的相同的输出:

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

输出值

SOURCE FSTYPE  SIZE  USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G  1.1G 10.6G  10% /tmp

我喜欢它,除了有关的内容外-D,我没有其他选择。(我使用的是Debian7,util-linux 2.20.1-5.3)
ctrl-alt-

几天后,我会√√,您将花一些时间看是否有人有一个更完美的答案。尽管这接近完美(如果它像df一样工作:不需要循环,那将是完美的)。
ctrl-alt-delor 2014年

@richard-这是一个好主意-当答案很快被接受时,我不喜欢它。关于循环,而且df-我愿意打赌它确实会循环,您不必告诉它这样做。
mikeserv

1
感谢@ramesh我们也可以做findmnt $(stat "--printf=%m\n" .)
ctrl-alt-

2
我的版本findmnt具有-T可以绕过cd ..循环的选项。可能对其他人有用。
氮气

1

Linux / Unix的方式是拥有一个小型实用工具箱,这些实用工具组合在一起后,可以为您提供想要的结果。

他们往往没有在每种情况下都有用。取而代之的是,您有许多小的有用的实用程序,它们与管道等组合在一起。这样做的好处是,如果没有可用的程序,则可以很容易地编写自己的实用程序。

例如,要获取您想要的信息,可以使用:

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

如果要在不同目录中重复使用以上内容,请创建一个脚本:

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

将其另存为mountinfo并使其可执行(chmod +x mountinfo)。然后可以将其用作:

mountinfo .

如果您想要一个对所有事物都互不影响的实用程序的系统,那么盖茨先生一定可以为您提供帮助;-)


--output仅存在于最新版本的GNU coreutils(≥8.22)中。
吉尔斯(Gilles)'“ SO-不要邪恶”

这几乎就是我一直在做的事情,只是mount没有选项似乎有些事后思考:使用选项创建挂载点时,如果没有列出它们,我希望有一个更好的列表工具。如我们所见,@ mikeserv已显示给我们findmnt
ctrl-alt-delor 2014年

1

如果安装点包含空格,可能会有些混乱,但这应该可以工作,除非安装点包含换行符:

#!/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为文件系统输出一行;如果没有该选项,df则如果安装点很长,则可能会输出两行。安装点名称与标题行中的“ Mounted on”标签位于同一列中。

得到挂载点后,我们在中输出grep mount


1

我不知道命令,但是您可以创建一个函数。您可以将以下内容添加到您的.bashrc

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

这将执行mount命令并将输出传递给grepgrep将寻找的输出df -P "$1" | tail -n 1 | awk '{print $1}',并将其分解:

  • df -P "$1"df在传递给函数的参数上运行,
  • tail -n 1只会输出第二行,其中包含partition信息。
  • awk '{print $1}'将打印该行的第一部分,例如磁盘/分区号/dev/sda5。这就是grep在mount命令中寻找并输出的内容。

获取.bashrc文件以应用更改,或注销并重新登录。

现在,如果您运行mountinfo .,您将获得所需的输出。


这几乎就是我一直在做的事情(但是没有功能,我做得还不够,当我在其他系统上运行时,例如在此站点上的答案。),只是mount没有选择似乎有点事后的想法:有了创建挂载点的选项,但没有列出挂载点,我希望有一个更好的列表工具。如我们所见,@ mikeserv已显示给我们findmnt
ctrl-alt-delor 2014年

0

如果您使用的不是GNU coreutils df的较旧版本,则echo $(df . --output=target | tail -n 1)可以使用。与相似stat -c '%m' .,尽管我注意到https://linux.die.net/man/1/stat缺少%mformat选项的文档。

可移植地进行此操作很烦人:以上两种方法均不适用于stat或df的BSD或Cygwin版本。如果不是要在挂载点的路径中留出空格,那df -P . | tail -1 | awk '{ print $NF}'会很好,但是USB闪存驱动器通常在卷名中留有空格,这很可能会出现在挂载路径中并破坏了它。为了实现可移植性,Perl几乎可以在任何地方安装,并且CPAN具有Sys :: Filesystem :: MountPoint模块,该模块提供了所需的功能。


您能告诉我们echo $()该命令增加了什么吗?
ctrl-alt-delor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.