2013-04-23 57 views
3

想要制作脚本(称为getmpoint)什么将从任何文件名返回挂载点。来自文件名的挂载点 - 便携的方式

第1的想法,比如:解析输出形成df或分析fstab并不像看起来那么容易,因为例如:

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

我必须使用stat(获取装置)的一些想法 - 但我迷路了。需要一些指导如何解决这个问题。

另一个问题是,stat命令与Freebsd-statLinux-stat不同。这里有任何便携式的方式?

同样的,怎么样:

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

将是很好的获得只能从路径挂载点 - 无文件存在 - 所以没有stat

任何建议? (我可能能够使脚本自己 - 但需要一些指导如何做...)

回答

2

试试这个:

getmpoint.sh,预计文件名作为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 
+0

谢谢!好的解决方案和便携式。 – jm666 2013-04-23 22:08:28

+0

嘿嘿,不错的编辑:)如果可以的话,会提高它;)。请注意,我第一次尝试类似'df ... |尾巴-n 1',并惊讶于这没有奏效。然而'sed'1d''应该可以工作,尽管我更喜欢'awk'解决方案,因为它给了你第六列(挂载)而不需要额外的解析工作 – hek2mgl 2013-04-23 22:09:47

+0

是的 - 当文件名包含空格时,回到awk :) – jm666 2013-04-23 22:41:12