Làm thế nào để quyết định rằng mv di chuyển vào một thư mục thay vì thay thế thư mục?


18

Nói rằng tôi có một thư mục /hello.

Rồi tôi làm mv /hello /hello2.

Tôi đang di chuyển /hellovào /hello2/hello? Hay tôi đang chuyển /hellođến /hello2?

Có vẻ như khi tôi làm một cái gì đó như thế này, tôi nhận được kết quả không nhất quán.


1
Trong trường hợp nào là kết quả không nhất quán? Dường như bất cứ khi nào thư mục đích tồn tại, nó sẽ di chuyển vào thư mục đích, nếu không nó sẽ được đổi tên.
jmathew

Điều đó không nhất quán. Các lệnh tương tự nên làm điều tương tự. Điều đó có nghĩa là lệnh là mơ hồ.
dùng4951

Điều đó không thực sự mâu thuẫn vì nó hoạt động nhất quán trong bối cảnh. Mặc dù tôi có thể thấy nó khó hiểu như thế nào nhưng tôi càng nghĩ về nó, lệnh phải theo cách đó để hoạt động cho tất cả các kịch bản.
jmathew

Tôi muốn nói rằng đó là cách nó được thiết kế và nó cũng hợp lý..nếu bạn sử dụng mvvới các tệp thì nó cũng làm điều tương tự. Đổi tên. Nhưng với mvcác thư mục Sẽ không tốt khi xóa toàn bộ thư mục bằng thư mục con vì một mvlệnh không phải là an toàn vì vậy nó được di chuyển như test1/test2. nhưng nếu bạn vẫn muốn đạt được nó, hãy viết một aliastham số để kiểm tra xem tham số đã cho có phải là thư mục không và sau đó thực hiện rm -rf thư mục và sử dụng mvlệnh nhưng bạn có thể tự chịu rủi ro.
harish.venkat

Tôi nghi ngờ ví dụ của bạn dựa trên việc đánh giá sai một điều gì đó đã xảy ra trong quá khứ, dựa trên "Dường như tôi làm điều gì đó như thế này". Nếu cả hai /hello/hello2là thư mục, thì tôi nhận thấy đó cp /hello /hello2là thư mục không nhất quán. Tùy thuộc vào sự kết hợp của dấu gạch chéo ở đó, đôi khi nội dung /hellođược sao chép vào /hello2và đôi khi chính thư mục được sao chép.
Izkata

Câu trả lời:


16

mv a bcố gắng di chuyển avào bnếu blà một thư mục hoặc một liên kết tượng trưng đến một thư mục. Nếu không, nó sẽ đổi tên (hoặc sao chép và xóa nếu trên các hệ thống tệp khác nhau) athành b.

Để có được kết quả nhất quán để di chuyển tệp vào một thư mục, bạn có thể làm:

mv file dir/

hoặc là

mv file dir/.

Nếu dirkhông tồn tại, bạn sẽ gặp lỗi và nó sẽ không đổi tên filethành dir.

Mặt khác, nếu bạn muốn thực hiện renamemà không phải lo lắng liệu tệp đích có tồn tại dưới dạng thư mục hay không, với GNU mv, bạn có thể thực hiện:

mv -T file dest

Trong trường hợp đó, filesẽ không được chuyển vào destnếu destlà một thư mục. Tuy nhiên, nếu cả hai filedestlà thư mục desttrống và filesẽ được đổi tên thành dest(và bản gốc destbị xóa). Nếu cả hai đều là thư mục và destkhông trống, mv -Tsẽ khiếu nại.

Tương tự, nếu filekhông phảidest là thư mục (và bao gồm các liên kết tượng trưng bao gồm cả liên kết tượng trưng đến thư mục), sẽ được đổi tên thành (mặc dù bạn sẽ nhận được lời nhắc nếu bạn không có quyền ghi ) và bản gốc sẽ bị xóa. Có một sự khác biệt trong trường hợp là một liên kết tượng trưng đến một thư mục. Với , được đổi tên thành , nhưng không , được chuyển vào thư mục được chỉ bởi .filedestdestdestmv file destdest-Tfiledest-Tfiledest

Vì vậy, để tổng hợp, sau đó mv -T file dest, một trong hai filesẽ được đổi tên thành desthoặc bạn sẽ nhận được thông báo lỗi (hoặc lời nhắc). Nếu lệnh thành công, bản gốc dest, nếu nó tồn tại trước đó sẽ bị xóa.


14

Điều này hoàn toàn phụ thuộc vào việc đã có thư mục có tên '/ hello2' hay chưa.

Nếu / hello2 tồn tại VÀ là một thư mục, thì di chuyển sẽ luôn di chuyển / hello đến / hello / hello2

Nếu / hello2 không tồn tại, thì di chuyển sẽ luôn đổi tên / hello thành / hello2

Nếu / hello2 tồn tại VÀ là một tệp, bạn sẽ gặp lỗi, "không thể ghi đè lên không phải thư mục 'hello2' với thư mục 'xin chào'.


3

Tôi đã thử những

mkdir test1
mv -v test1 test2
output:`test1' -> `test2'
mkdir test1
mv -v test2 test1
output: `test2' -> `test1/test2'
touch test2
output:mv: cannot overwrite non-directory `test2' with directory `test1'

hy vọng điều này giải thích mọi thứ. -vlà chế độ dài dòng.

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.