2つのディレクトリまたはファイルが同じファイルシステムに属しているかどうかを確認する方法


15

2つのディレクトリが同じファイルシステムに属しているかどうかを確認する最良の方法は何ですか?

受け入れられる答え:bash、python、C / C ++。


python / C ++の回答が必要な場合は、間違ったサイトにいます
Michael Mrozek

良い点-「python、C / C ++は許容可能」と書くべきです。
グジェゴシWierzowiecki

:CのAPIに関する質問は上のトピックであることを覚えて@MichaelMrozek meta.unix.stackexchange.com/questions/314/...
グジェゴシWierzowiecki

回答:



3

標準コマンドdfは、指定されたファイルがどのファイルシステムにあるかを示します。

if df -P -- "$1" "$2" | awk 'NR==2 {dev1=$1} NR==3 {exit($1!=dev1)}'; then
  echo "$1 and $2 are on the same filesystem"
else
  echo "$1 and $2 are on different filesystems"
fi

3

Qt / C ++ベースのプロジェクトで同じ質問に出会ったところ、このシンプルでポータブルなソリューションが見つかりました。

#include <QFileInfo>
...
#include <sys/stat.h>
#include <sys/types.h>
...
bool SomeClass::isSameFileSystem(QString path1, QString path2)
{
        // - path1 and path2 are expected to be fully-qualified / absolute file
        //   names
        // - the files may or may not exist, however, the folders they belong
        //   to MUST exist for this to work (otherwise stat() returns ENOENT) 
        struct stat stat1, stat2;
        QFileInfo fi1(path1), fi2(path2),
        stat(fi1.absoluteDir().absolutePath().toUtf8().constData(), &stat1);
        stat(fi2.absoluteDir().absolutePath().toUtf8().constData(), &stat2);
        return stat1.st_dev == stat2.st_dev;
}

非常に特殊なライブラリ、重い標準ではありません。
サンドバーグ

1

「統計」の答えは最も簡単ですが、2つのファイルシステムが同じデバイス上にある場合、誤検出されます。これまでに見つけた最高のLinuxシェルメソッドを次に示します(この例はBashの場合です)。

if [ "$(df file1 --output=target | tail -n 1)" == \
     "$(df file2 --output=target | tail -n 1)" ]
    then echo "same"
fi

(coreutils 8.21以降が必要です)


これには、Coreutils 8.21以降が必要です。(機能を追加したコミット)(機能を報告するリリースノート
キースラッセル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.