ファイルがある場合、/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
いくつかありますが、どのツールを使用できるかによって異なります。あなたはシェルにいますか?スクリプトやプログラムを書いていますか?どの言語で?
これstat()
機能指定されたファイルのデバイス識別子を返します。
コマンドも同じですstat(1)
。stat -c %D filename
スクリプトで使用することもできます。たとえば、
stat -c %D /mnt/persistent/test
「0821」を提供します。これは、デバイス8、サブデバイス33(「21」は16進数で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
あなたの友人ですか? 「デバイス」フィールドは、ファイルがどのデバイスにあるかを示します。読むこれデバイスフィールドの解釈方法に関する追加情報。