Cách di chuyển thư mục trong unix bằng mv, chỉ khi mục tiêu nằm trên cùng một ổ đĩa


10

Tôi cần di chuyển một thư mục bằng lệnh unix mv, nhưng chỉ khi mục tiêu nằm trong cùng một ổ đĩa hoặc cùng một hệ thống tập tin. Điều gì sẽ là cách tiếp cận tốt nhất?

linux  bash  shell  unix  mv 

1
lái xe ở đây bạn có nghĩa là "thiết bị"? vd: cùng ổ cứng?
Kent

cùng một thiết bị, có

Câu trả lời:


9

Dựa trên 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 ( /unix// ):

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

Vì vậy, bạn có thể:

file1=$(stat -c "%d" /path/file1)
file2=$(stat -c "%d" /path/file2)

rồi so sánh.

Bạn cũng có thể viết như thế này:

if [ $(stat -c "%d" /path/file1) -eq $(stat -c "%d" /path/file1) ]
then
    # mv sentence
fi

Tùy chọn khác. Cũng lấy từ câu hỏi Stackexchange :

if [[ $(df -P /path/file1 | tail -1) = $(df -P /path/file2 | tail -1) ]]
then
    # echo "same filesystem"
    # mv sentence
fi

Bạn có nghĩ rằng nó tương thích trên các bản phân phối linux?

Chỉ để truyền bá thực hành tốt hơn, sử dụng $(...)thay vì `...`. Cái sau bị phản đối có lợi cho cái trước.
Shahbaz

Cảm ơn @Shahbaz, chỉ cần chỉnh sửa nó với đề xuất của bạn!
fedorqui

@zapp Tôi không biết, nên kiểm tra nó. Kinh nghiệm của tôi với stattôi đôi khi rất khó khăn, ít nhất là với SunOS. Nhưng là Linux tôi hy vọng nó tương thích. Với Ubuntu 12 của tôi thì ổn.
fedorqui

điều này tạo %dra các giá trị khác nhau cho các thư mục khác nhau (cùng phân vùng) thử với của bạn //tmp
Kent

2

Đây có lẽ không phải là giải pháp sạch nhất, nhưng bạn có thể sử dụng thực tế là các liên kết cứng không thể được tạo giữa các ổ đĩa.

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
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.