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

Существует тот же тип проблемы для awesomewm и вероятно довольно много других менеджеров окон.

dmw Wiki имеет раздел по этому: Фиксация неправильно себя ведущих JAVA-приложений. Предложенное решение состоит в том, чтобы изменить имя менеджера окон путем установки wmname, и затем выполнение:

$ wmname LG3D

Если это работает, удостоверьтесь, что это называют при каждых X запусках сессии.

awesomewm Wiki имеет это то же предложение и другие обходные решения, которые, скорее всего, относятся для dwm здесь: проблемы с Java.

15
30.07.2012, 12:43
4 ответа

Это может быть сделано путем сравнения номеров устройств.

В сценарии оболочки на Linux это может быть сделано со статистикой:

stat -c "%d" /path  # returns the decimal device number 

В Python:

os.lstat('/path...').st_dev

или

os.stat('/path...').st_dev
23
27.01.2020, 19:49

Стандартная команда 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
27.01.2020, 19:49

Я только что наткнулся на тот же вопрос в проекте на основе 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;
}
3
27.01.2020, 19:49

Ответ «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 или новее)

2
27.01.2020, 19:49

Теги

Похожие вопросы