Как проверить, принадлежат ли две директории или файлы одной и той же файловой системе


15

Как лучше всего проверить, принадлежат ли два каталога одной и той же файловой системе?

Приемлемые ответы: bash, python, C / C ++.


Если вы хотите получить ответы на языке Python / C ++, вы не на том сайте
Майкл Мрозек

Хороший вопрос - я должен написать «Python, C / C ++ приемлемы».
Гжегож Вежовецкий

@MichaelMrozek помните, что вопросы по API C являются тематическими: 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 или новее. ( зафиксировать, что добавили функцию) ( заметки о выпуске , сообщающие о функции)
Кит Рассел
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.