Як перевірити, чи належать два каталоги або файли до однієї файлової системи


15

Який найкращий спосіб перевірити, чи належать два каталоги до однієї файлової системи?

Прийнятні відповіді: bash, python, C / C ++.


Якщо ви хочете відповісти python / C ++, ви знаходитесь на неправильному сайті
Michael Mrozek

Хороший момент - я повинен написати "python, C / C ++ - прийнятні".
Grzegorz Wierzowiecki

@MichaelMrozek пам’ятайте, що питання API API на тему: meta.unix.stackexchange.com/questions/314/…
Grzegorz 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

Відповідь "stat" є короткою, але вона отримує помилкові позитиви, коли дві файлові системи знаходяться на одному пристрої. Ось найкращий метод оболонки 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 або новіші. ( Здійснити що додали функцію) ( примітки до випуску , повідомляють функції)
Keith Russell
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.