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 ++.


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:



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

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;
}

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)


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.