Cara memeriksa apakah dua direktori atau file milik sistem file yang sama

15

Apa cara terbaik untuk memeriksa apakah dua direktori milik sistem file yang sama?

Jawaban yang dapat diterima: bash, python, C / C ++.

Grzegorz Wierzowiecki
sumber
Jika Anda ingin jawaban python / C ++ Anda berada di situs yang salah
Michael Mrozek
Poin bagus - saya harus menulis "python, C / C ++ dapat diterima".
Grzegorz Wierzowiecki
@MichaelMrozek ingat bahwa pertanyaan C API ada di topik: meta.unix.stackexchange.com/questions/314/…
Grzegorz Wierzowiecki

Jawaban:

23

Ini dapat dilakukan dengan membandingkan nomor perangkat .

Dalam skrip shell di Linux dapat dilakukan dengan stat :

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

Dengan python :

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

atau

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

Perintah standar dfmenunjukkan pada sistem file apa file yang ditentukan berada.

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- berhenti menjadi jahat'
sumber
3

Saya baru saja menemukan pertanyaan yang sama dalam proyek berbasis Qt / C ++, dan menemukan solusi sederhana dan portabel ini:

#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;
}
Kue kering
sumber
Perpustakaan sangat spesifik, berat dan tidak standar.
Sandburg
1

Jawaban "stat" tersest, tetapi mendapat false positive ketika dua filesystem berada di perangkat yang sama. Inilah metode shell Linux terbaik yang saya temukan sejauh ini (contoh ini untuk Bash).

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

(membutuhkan coreutils 8.21 atau yang lebih baru)

Keith Russell
sumber
Ini membutuhkan Coreutils 8.21 atau yang lebih baru. ( komit yang menambahkan fitur) ( catatan rilis yang melaporkan fitur)
Keith Russell