Cách kiểm tra xem hai thư mục hoặc tệp có thuộc cùng một hệ thống tệp không


15

Cách tốt nhất để kiểm tra xem hai thư mục có thuộc cùng một hệ thống tập tin không?

Câu trả lời chấp nhận được: bash, python, C / C ++.


Nếu bạn muốn câu trả lời python / C ++ bạn đang ở sai trang web
Michael Mrozek

Điểm hay - Tôi nên viết "python, C / C ++ được chấp nhận".
Grzegorz Wierzowiecki

@MichaelMrozek nhớ rằng các câu hỏi về API C thuộc chủ đề: meta.unix.stackexchange.com/questions/314/ Kẻ
Grzegorz Wierzowiecki

Câu trả lời:


23

Nó có thể được thực hiện bằng cách so sánh số thiết bị .

Trong một kịch bản shell trên Linux, nó có thể được thực hiện với stat :

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

Trong trăn :

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

hoặc là

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

3

Lệnh tiêu chuẩn dfhiển thị trên hệ thống tệp nào (các) tệp được chỉ định được đặt.

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

Tôi vừa gặp một câu hỏi tương tự trong một dự án dựa trên Qt / C ++ và tìm thấy giải pháp đơn giản và di động này:

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

Thư viện rất cụ thể, nặng và không chuẩn.
Sandburg

1

Câu trả lời "stat" là khó nhất, nhưng nó bị dương tính giả khi hai hệ thống tập tin nằm trên cùng một thiết bị. Đây là phương pháp shell Linux tốt nhất mà tôi đã tìm thấy cho đến nay (ví dụ này là dành cho Bash).

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

(yêu cầu coreutils 8.21 hoặc mới hơn)


Điều này đòi hỏi Coreutils 8.21 hoặc mới hơn. ( cam kết đã thêm tính năng này) ( ghi chú phát hành báo cáo tính năng này)
Keith Russell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.