¿Cuál es la mejor manera de verificar si dos directorios pertenecen al mismo sistema de archivos?
Respuestas aceptables: bash, python, C / C ++.
¿Cuál es la mejor manera de verificar si dos directorios pertenecen al mismo sistema de archivos?
Respuestas aceptables: bash, python, C / C ++.
Respuestas:
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
El comando estándar df
muestra 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
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;
}
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)