Kiểm tra xem hai đường dẫn có trỏ đến cùng một tệp không


12

Tôi đã có một tập lệnh để tạo đệ quy các liên kết tượng trưng trong thư mục chính của tôi vào thư mục cài đặt của tôi, để giữ các tệp dưới sự kiểm soát phiên bản. Tôi muốn nó bỏ qua các tập tin đã được liên kết thông qua một thư mục mẹ. Đó là, nếu tôi có các tệp / thư mục này:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

, làm cách nào để kiểm tra xem ~ / foo / bar và ~ / settings / foo / bar có cùng một tệp không?

Chỉnh sửa : D'oh, một vài phút tìm kiếm đã tiết lộ câu trả lời :readlink -f $path

Câu trả lời:


6

Nếu hai tệp có cùng ID thiết bị và inode, chúng là cùng một tệp. Công statcụ dòng lệnh giúp dễ dàng tìm thấy

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

cái này hoạt động cho các tập tin liên kết hoặc tập tin liên kết cứng.


5
Để theo các liên kết tượng trưng, ​​bạn cần stat -L.
Gilles 'SO- ngừng trở thành ác quỷ'

Giống như @Gilles đã nói, không có công tắc -L, bạn có thể nhận được kết quả sai trên một số bản phân phối
Olaseni

18

Nhiều shell có một -eftoán tử cho testnội dung (hoặc từ đồng nghĩa của nó [) để kiểm tra xem hai đường dẫn có trỏ đến cùng một tệp hiện có không (theo các liên kết tượng trưng). Điều này bao gồm bash, dash, pdksh, ksh88, ksh93 và zsh, nhưng không phải là POSIX sh. Trong bash, ksh hoặc zsh, bạn cũng có thể sử dụng -eftrong [[ … ]]cấu trúc có điều kiện.

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
Theo trang của tôi, -ef thực hiện chính xác như câu trả lời của Rich Homolka.
user13852

2
@ user13852 -efcó ưu điểm là dễ di chuyển hơn (cũng nhanh hơn một chút, nhưng không vì thế mà bạn sẽ chú ý hầu hết thời gian). Ví dụ: nó hoạt động trên * BSD, OSX, BusyBox cũng như Linux / Cygwin (GNU). Nó cũng rõ ràng hơn, vì nó làm chính xác những gì được yêu cầu. Lợi thế duy nhất tôi có thể thấy để gọi statlà khi bạn không muốn theo liên kết tượng trưng.
Gilles 'SO- ngừng trở nên xấu xa'

0

Đối với các liên kết mềm (được tạo bằng ln -s), bạn có thể sử dụng realpath. Điều này sẽ không làm việc cho các liên kết cứng mặc dù.

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.