14

次の非常に堅牢でないシェル コードは、マウント ポイントを指定し$pathます。

(for i in $(df|cut -c 63-99); do case $path in $i*) echo $i;; esac; 完了) | テール -n 1

シェルでこれを行うより良い方法はありますか?

あとがき

このスクリプトは本当にひどいものですが、自分のシステムで動作するという利点があります。いくつかのマウント ポイントが のプレフィックスである場合があることに注意してください$path

Linux システムの場合:

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

Mac OSX システムの場合

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

df の出力が異なるため、cut のパラメーターを変更する必要があることに注意してください。awk を使用するとこれは解決しますが、df return のさまざまな実装をフォーマットする結果の範囲を考えると、awk でさえ移植性がありません。

回答 シェル内で表形式の出力を変更することが唯一の方法のように見えますが、

df -P "$パス" | テール -1 | awk '{ print $NF}'

ghostdog74 の回答に基づいて、私が持っていたものを大幅に改善しました。2 つの新しい問題に注意してください。まず、既存のファイルに名前を付けるdf $pathことを主張し$pathます。上記のスクリプトは気にしません。第二に、シンボリックリンクの逆参照について心配する必要はありません。マウント ポイントにスペースが含まれている場合、これは機能しません。これは、ボリューム名にスペースが含まれるリムーバブル メディアがある場合に発生します。

ジョブを適切に実行する Python コードを作成することは難しくありません。

4

12 に答える 12

21

dfパスをパラメーターとして受け取るため、このようなものはかなり堅牢なはずです。

df "$path" | tail -1 | awk '{ print $6 }'
于 2010-01-30T10:48:55.580 に答える
16

理論的statには、ファイルが存在するデバイスがわかります。デバイスをマウントポイントにマッピングする方法が必要です。

たとえば、Linux では次のように動作します。

stat -c '%m' $path
于 2010-01-30T11:41:13.193 に答える
7

出力を操作するよりも堅牢である可能性があるため (たとえば、マウント ポイントにスペースが含まれている場合)、プログラムの書式設定オプションを使用することが常に好まれてきました。GNUdfでは次のことが可能です。

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

残念ながら、ヘッダーの出力を防止するオプションがないため、テールは引き続き必要です。

于 2014-01-16T18:12:49.810 に答える
1

あなたの希望する出力が何であるかわかりません。したがって、これは推測です

#!/bin/bash

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

-c でのカットの使用は、 df の出力が異なるため、実際には信頼できません。たとえば、5% が 10% に変更され、一部の文字が欠落する可能性があります。マウント ポイントは常に後ろにあるため、フィールドとフィールド区切り文字を使用できます。上記で、$NF はマウント ポイントである最後の列です。

于 2010-01-30T10:42:55.667 に答える
1

statDouglas Leeder が提案するように、ソース コードを df に持って行き、呼び出し以外に何をするかを調べます。

出力を行ごとに解析dfすると、これらの行が次のように見えることが多いため、問題が発生します。

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

これらの種類の行の解析も複雑になるため、おそらくマウントポイントの呼び出しstatと検索はそれほど複雑ではありません。

于 2010-01-30T12:08:05.983 に答える
0

Linuxにはこれがあり、スペースの問題を回避できます:

lsblk -no MOUNTPOINT ${device}

BSDランドについてはわかりません。

于 2014-01-15T03:44:24.533 に答える
0

以前の質問を調べたときにこれを見逃していました: Python: Get Mount Point on Windows or Linuxos.path.ismount(path)は、パスがマウント ポイントであるかどうかを示しています。

私の好みはシェル ソリューションですが、これはかなり単純に見えます。

于 2010-01-31T11:00:45.270 に答える
0
mount | grep "^$path" | awk '{print $3}'
于 2010-01-30T14:32:16.783 に答える
0

私はこれを使用します:

df -h $path | cut -f 1 -d " " | tail -1
于 2014-01-08T19:39:30.540 に答える