Cómo verificar si dos directorios o archivos pertenecen al mismo sistema de archivos

15

¿Cuál es la mejor manera de verificar si dos directorios pertenecen al mismo sistema de archivos?

Respuestas aceptables: bash, python, C / C ++.

Grzegorz Wierzowiecki
fuente
Si quiere respuestas de Python / C ++, está en el sitio equivocado
Michael Mrozek
Buen punto: debería escribir "python, C / C ++ son aceptables".
Grzegorz Wierzowiecki
@MichaelMrozek recuerda que las preguntas de la API C son sobre el tema: meta.unix.stackexchange.com/questions/314/…
Grzegorz Wierzowiecki

Respuestas:

23

Se puede hacer comparando números de dispositivo .

En un script de shell en Linux se puede hacer con stat :

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

En python :

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

o

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

El comando estándar dfmuestra en qué sistema de archivos se encuentran los archivos especificados.

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- deja de ser malvado'
fuente
3

Acabo de encontrar la misma pregunta en un proyecto basado en Qt / C ++, y encontré esta solución simple y 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;
}
Galleta
fuente
Biblioteca muy específica, pesada y no estándar.
Sandburg el
1

La respuesta "estadística" es más estricta, pero obtiene falsos positivos cuando dos sistemas de archivos están en el mismo dispositivo. Aquí está el mejor método de shell de Linux que he encontrado hasta ahora (este ejemplo es para Bash).

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

(requiere coreutils 8.21 o más reciente)

Keith Russell
fuente
Esto requiere Coreutils 8.21 o posterior. ( confirmación que agregó la función) ( notas de la versión que informan la función)
Keith Russell