วิธีตรวจสอบว่าสองไดเร็กทอรีหรือไฟล์อยู่ในระบบไฟล์เดียวกัน


15

วิธีที่ดีที่สุดในการตรวจสอบว่าสองไดเรกทอรีเป็นของระบบไฟล์เดียวกันคืออะไร?

คำตอบที่ยอมรับได้: bash, python, C / C ++


ถ้าคุณต้องการ python / C ++ ตอบคุณอยู่ผิดไซต์
Michael Mrozek

ข้อดี - ฉันควรเขียน "python, C / C ++ เป็นที่ยอมรับ"
Grzegorz Wierzowiecki

@MichaelMrozek โปรดจำไว้ว่าคำถาม C API อยู่ในหัวข้อ: meta.unix.stackexchange.com/questions/314/…
Grzegorz Wierzowiecki

คำตอบ:


23

ก็สามารถทำได้โดยการเปรียบเทียบตัวเลขอุปกรณ์

ในเชลล์สคริปต์บน Linux สามารถทำได้ด้วยstat :

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

ในหลาม :

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

หรือ

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


3

ฉันเพิ่งเจอคำถามเดียวกันในโครงการตาม Qt / C ++ และพบโซลูชันที่ง่ายและพกพานี้:

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

ห้องสมุดที่เฉพาะเจาะจงมากหนักและไม่ได้มาตรฐาน
Sandburg

1

คำตอบ "stat" นั้นยากที่สุด แต่จะได้รับผลบวกปลอมเมื่อระบบไฟล์ทั้งสองอยู่ในอุปกรณ์เดียวกัน นี่เป็นวิธี Linux shell ที่ดีที่สุดที่ฉันเคยพบ (ตัวอย่างนี้ใช้สำหรับ Bash)

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

(ต้องการ coreutils 8.21 หรือใหม่กว่า)


สิ่งนี้ต้องใช้ Coreutils 8.21 หรือใหม่กว่า ( การกระทำที่เพิ่มคุณลักษณะ) ( บันทึกประจำรุ่นที่รายงานคุณลักษณะ)
คี ธ รัสเซล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.