如果我有一个文件/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
是你的朋友吗? “设备”字段将告诉您文件所在的设备。读这有关如何解释设备字段的更多信息。