Como verificar se dois diretórios ou arquivos pertencem ao mesmo sistema de arquivos

15

Qual é a melhor maneira de verificar se dois diretórios pertencem ao mesmo sistema de arquivos?

Respostas aceitáveis: bash, python, C / C ++.

Grzegorz Wierzowiecki
fonte
Se você quiser Python / respostas C ++ você está no site errado
Michael Mrozek
Bom ponto - eu deveria escrever "python, C / C ++ são aceitáveis".
Grzegorz Wierzowiecki 29/07
@MichaelMrozek lembrar que C perguntas API são on-topic: meta.unix.stackexchange.com/questions/314/...
Grzegorz Wierzowiecki

Respostas:

23

Isso pode ser feito comparando números de dispositivos .

Em um script de shell no Linux, isso pode ser feito com stat :

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

Em python :

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

ou

os.stat('/path...').st_dev
Grzegorz Wierzowiecki
fonte
3

O comando padrão dfmostra em qual sistema de arquivos os arquivos especificados estão localizados.

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
Gilles 'SO- parar de ser mau'
fonte
3

Acabei de encontrar a mesma pergunta em um projeto baseado em Qt / C ++ e encontrei esta solução simples e portátil:

#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;
}
Bolacha
fonte
Biblioteca muito específica, pesada e não padrão.
Sandburg
1

A resposta "stat" é concisa, mas obtém falsos positivos quando dois sistemas de arquivos estão no mesmo dispositivo. Aqui está o melhor método de shell do Linux que eu encontrei até agora (este exemplo é para o Bash).

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

(requer coreutils 8.21 ou mais recente)

Keith Russell
fonte
Isso requer o Coreutils 8.21 ou mais recente. ( Cometem que acrescentou o recurso) ( notas de lançamento que relatam o recurso)
Keith Russell