Quelle est la meilleure façon de vérifier si deux répertoires appartiennent au même système de fichiers?
Réponses acceptables: bash, python, C / C ++.
Quelle est la meilleure façon de vérifier si deux répertoires appartiennent au même système de fichiers?
Réponses acceptables: bash, python, C / C ++.
Réponses:
Cela peut être fait en comparant les numéros d'appareils .
Dans un script shell sous Linux, cela peut être fait avec stat :
stat -c "%d" /path # returns the decimal device number
En python :
os.lstat('/path...').st_dev
ou
os.stat('/path...').st_dev
La commande standard df
indique sur quel système de fichiers se trouve le ou les fichiers spécifiés.
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
Je viens de rencontrer la même question dans un projet basé sur Qt / C ++, et j'ai trouvé cette solution simple et portable:
#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;
}
La réponse "stat" est tersest, mais elle obtient des faux positifs lorsque deux systèmes de fichiers sont sur le même périphérique. Voici la meilleure méthode de shell Linux que j'ai trouvée jusqu'à présent (cet exemple concerne Bash).
if [ "$(df file1 --output=target | tail -n 1)" == \
"$(df file2 --output=target | tail -n 1)" ]
then echo "same"
fi
(nécessite coreutils 8.21 ou plus récent)