有没有办法知道文件位于哪个设备上?

有没有办法知道文件位于哪个设备上?

如果我有一个文件/abc/def/ghi/jkl,有没有办法知道它位于哪个设备上,或者我应该解析/etc/mtab并查看哪个/abc/def/ghi/jkl更匹配?

答案1

df 将告诉您设备名称和安装点,ls 将告诉您设备编号:

paul $ pwd
/home/paul/SandBox/Toys/hSort
paul $ ls -l ReadMe
-rw-r--r-- 1 paul paul 296 Jan  8  2020 ReadMe

paul $ df ReadMe
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda9      103818480 3796556  94725184   4% /home

paul $ ls -l /dev/sda9
brw-rw---- 1 root disk 8, 9 Jul 12 12:10 /dev/sda9

答案2

如果在 Linux 上,您可以运行findmnt(联机帮助页) 在文件的路径上:

findmnt -T /abc/def/ghi/jkl

由于输出不是可解析的,如果您想将列(在本例中为 SOURCE)的结果读入变量,您可以执行以下操作:

source=$(findmnt -rno SOURCE -T /abc/def/ghi/jkl)

(注意$source可能并不总是块设备文件的路径,例如网络或熔丝文件系统、tmpfs 等)。

答案3

有几种,但这取决于您可以使用哪些工具。你在 shell 上,你在写脚本或程序吗?用什么语言?

stat()功能将返回指定文件的设备标识符。

命令也将如此stat(1)。您也许可以stat -c %D filename在脚本中使用。例如:

stat -c %D /mnt/persistent/test

将给出“0821”。这意味着设备 8,次设备 33(“21”在十六进制中是 33)。这样我就可以查看/dev哪个设备的编号为 8、33:

ls -l /dev | grep " 8, *33 "
brw-rw---- 1 root disk      8,  33 Jun 28 19:08 sdc1

否则,是的,使用realpath并与 mtab 匹配。在同一个例子中:

REALPATH="$( realpath /mnt/persistent/test )"
df | grep ^/ | tr -s " " \
| while read row; do 
    PREFIX=$( echo "$row" | cut -f 6 -d " " )
    if ( echo "$REALPATH" | grep ^$PREFIX > /dev/null ); then
        echo "$row" | cut -f 1 -d " "
    fi
 done | sort | tail -n 1

将输出:

 /dev/sdc1

尽管,正如 @Freddy 指出的,整个脚本在df自己的语法之后出现得非常糟糕:

df --output=source /mnt/persistent/test | tail -n1

答案4

stat是你的朋友吗? “设备”字段将告诉您文件所在的设备。读有关如何解释设备字段的更多信息。

相关内容