代码之家  ›  专栏  ›  技术社区  ›  Charles Stewart

给出路径的安装点

  •  13
  • Charles Stewart  · 技术社区  · 15 年前

    以下非常不健壮的shell代码将给出 $path :

     (for i in $(df|cut -c 63-99); do case $path in $i*) echo $i;; esac; done) | tail -n 1
    

    有没有更好的方法可以在shell中做到这一点?

    后记

    这个脚本真的很糟糕,但有一个弥补性的质量,它可以在我的系统上运行。注意,几个安装点可能是 $路径 .

    实例 在Linux系统上:

    cas@txtproof:~$ path=/sys/block/hda1
    cas@txtproof:~$ for i in $(df -a|cut -c 57-99); do case $path in $i*) echo $i;; esac; done| tail -1
    /sys
    

    在Mac OSX系统上

    cas local$ path=/dev/fd/0
    cas local$ for i in $(df -a|cut -c 63-99); do case $path in $i*) echo $i;; esac; done| tail -1
    /dev
    

    注意,由于df的输出方式不同,需要改变cut的参数;使用awk可以解决这一问题,但即使是awk也是不可移植的,因为df返回的各种实现的格式化结果范围很广。

    回答 看起来在shell中,咀嚼表格输出是唯一的方法,但是

    df -P "$path"  | tail -1 | awk '{ print $NF}'
    

    根据Ghostdog74的回答,这是对我的一个很大的改进。注意两个新问题:首先, df $path 坚持认为 $路径 命名一个现有的文件,我上面的脚本并不在意;其次,不必担心取消引用符号链接。如果装入点中有空格,这不起作用,如果可移动媒体的卷名中有空格,就会发生这种情况。

    要正确地完成这项工作,编写python代码并不困难。

    11 回复  |  直到 8 年前
        1
  •  17
  •   JesperE    15 年前

    df 以路径为参数,所以类似这样的东西应该是相当健壮的;

    df "$path" | tail -1 | awk '{ print $6 }'
    
        2
  •  14
  •   jelle foks    11 年前

    理论上 stat 将告诉您文件所在的设备,并且应该有某种方法将设备映射到装载点。

    例如,在Linux上,这应该可以工作:

    stat -c '%m' $path
    
        3
  •  5
  •   Graeme    11 年前

    总是热衷于使用程序的格式化选项,因为它比操作输出更强大(例如,如果装入点有空格)。GNU df 允许以下内容:

    df --output=target "$path" | tail -1
    

    不幸的是,我看不到阻止打印标题的选项,所以尾部仍然是必需的。

        4
  •  1
  •   ghostdog74    15 年前

    我不知道你想要的输出是什么,所以这是一个猜测

    #!/bin/bash
    
    path=/home
    df | awk -v path="$path" 'NR>1 && $NF~path{
     print $NF
    }'
    

    使用cut-with-c并不是很可靠,因为df的输出会有所不同,比如说5%可以更改为10%,您会错过一些字符。由于装入点总是在后面,所以可以使用字段和字段分隔符。在上面,$nf是最后一列,它是装入点。

        5
  •  1
  •   ndim    15 年前

    我将把源代码带到df并找出它除了调用 stat 正如道格拉斯·利德所说。

    的逐行分析 df 输出将导致问题,因为这些行通常看起来像

    /dev/mapper/VOLGROUP00-logical--volume
                          1234567  1000000  200000  90% /path/to/mountpoint
    

    随着解析这些类型的行的复杂性的增加,可能需要调用 斯达 找到安装点就不那么复杂了。

        6
  •  0
  •   Dennis Williamson    15 年前
    mount | grep "^$path" | awk '{print $3}'
    
        7
  •  0
  •   Community CDub    8 年前

    当我回顾之前的问题时,我错过了这一点: Python: Get Mount Point on Windows or Linux 也就是说 os.path.ismount(path) 指示路径是否为装入点。

    我喜欢shell解决方案,但这看起来很简单。

        8
  •  0
  •   Erik Aronesty    11 年前

    我用这个:

    df -h $path | cut -f 1 -d " " | tail -1
    
        9
  •  0
  •   BrainwreckedTech    11 年前

    Linux有这样的功能,可以避免空间问题:

    lsblk -no MOUNTPOINT ${device}
    

    对BSD土地不确定。

        10
  •  0
  •   Any Mouse    11 年前
    f () { echo $6; }; f $(df -P "$path" | tail -n 1)
    
        11
  •  0
  •   crashmaxed    11 年前

    如果只想使用df和awk来查找文件系统设备/远程共享或装入点,并且它们包含空格,则可以通过将awk的字段分隔符定义为与用于显示总大小、已用空间、可用空间和容量百分比的数字大小的格式相匹配的正则表达式来进行欺骗。通过将这些列定义为字段分隔符,您就可以 $1 表示文件系统设备/远程共享和 $NF 表示装入路径。

    例如:

    [root@testsystem ~] df -P
    Filesystem                       1024-blocks        Used Available Capacity Mounted on
    192.168.0.200:/NFS WITH SPACES   11695881728 11186577920 509303808      96% /mnt/MOUNT WITH SPACES
    

    如果你试图用快速和肮脏的 awk '{print $1}' awk '{print $NF}' 您只会得到文件系统/远程共享路径和挂载路径的一部分,这并不好。现在,使awk使用四个数字数据列作为字段分隔符。

    [root@testsystem ~] df -P "/mnt/MOUNT WITH SPACES/path/to/file/filename.txt" | \
    awk 'BEGIN {FS="[ ]*[0-9]+%?[ ]+"}; NR==2 {print $1}'
    192.168.0.200:/NFS WITH SPACES
    
    [root@testsystem ~] df -P "/mnt/MOUNT WITH SPACES/path/to/file/filename.txt" | \
    awk 'BEGIN {FS="[ ]*[0-9]+%?[ ]+"}; NR==2 {print $NF}'
    /mnt/MOUNT WITH SPACES
    

    享受:-

    编辑:这些命令是基于rhel/centos/fedora的,但是应该可以处理任何分发版。