Tại sao `mv file / dir` không di chuyển tệp đến thư mục con của thư mục làm việc hiện tại?


10

Tôi đã ở trong /etcthư mục của mình và gõ lệnh

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

Tôi nghĩ rằng sẽ di chuyển các tập tin vào openvpnthư mục là thư mục con của thư mục /etc. Tuy nhiên, đó dường như không phải là những gì đã xảy ra. Tất cả những gì tôi có thể xác nhận là lệnh đã được thực thi.

Câu trả lời:


51

Cung cấp một thư mục có tên này không tồn tại, bạn đổi tên tệp thành openvpnthư mục gốc của bạn /. Để hoàn nguyên điều này, hãy chạy:

sudo mv /openvpn /etc/MyFile.conf

Nếu thư mục tồn tại, bạn đã di chuyển tệp bên trong nó, thì sự đảo ngược là:

sudo mv /openvpn/MyFile.conf /etc/

Để di chuyển nó đến một thư mục con hiện có của thư mục hiện tại, bạn có thể chạy bất kỳ một trong số này - chúng sử dụng các đường dẫn tương đối :

mv MyFile.conf openvpn
mv MyFile.conf openvpn/
mv MyFile.conf ./openvpn
mv MyFile.conf ./openvpn/

.là một liên kết đến thư mục hiện tại, vì vậy ./ở đầu một đường dẫn có nghĩa là trong thư mục này. Dấu gạch chéo ở cuối có nghĩa openvpnlà một thư mục và bạn muốn di chuyển tệp bên trong nó. Nếu bạn không cung cấp nó, các tập tin sẽ được chuyển vào đó nếu một thư mục với tên này tồn tại, nếu không file sẽ được đổi tên để openvpn. Với một /lúc kết thúc, mvsẽ cảnh báo bạn nếu thư mục là mất tích và không đổi tên, vì vậy đó là cách an toàn nếu bạn không muốn đổi tên.

Nếu mặt khác, đường dẫn của bạn bắt đầu bằng /một đường dẫn tuyệt đối bất kể thư mục làm việc hiện tại, nó luôn luôn liên quan đến thư mục gốc /. Sử dụng đường dẫn tuyệt đối cho cả tệp và đích, lệnh của bạn sẽ như thế này:

mv /etc/MyFile.conf /etc/openvpn
mv /etc/MyFile.conf /etc/openvpn/

đọc thêm


2
Nếu bạn không biết liệu thư mục có tồn tại hay không, hãy thử sudo mv /openvpn/MyFile.conf /etc/lệnh trước. Trong trường hợp có khả năng thư mục không tồn tại, nó sẽ chỉ báo lỗi cho bạn (có thể là "Không phải là thư mục") và không chạm vào hệ thống tệp. Sau đó, bạn có thể làm sudo mv /openvpn /etc/MyFile.conf.
flarn2006

9

Bạn cần sử dụng

me@mylaptop:/etc$ sudo mv MyFile.conf openvpn/

để di chuyển MyFile.conftệp vào openvpnthư mục con của /etc/.

Mặt khác

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

thay vào đó sẽ di chuyển tệp vào /thư mục dưới dạng openvpn(tức là đổi tên thành openvpn) (giả sử /openvpnthư mục không tồn tại).


3
Ngoài ra, dấu gạch chéo ở cuối lệnh đầu tiên là tùy chọn. Nhưng tôi đoán đó là một thói quen tốt để tham gia, vì nó sẽ khiến lệnh thất bại nếu đó không phải là một thư mục, thay vì tạo ra một tình huống khó hiểu như OP mô tả (hoặc tệ hơn, ghi đè lên một tệp quan trọng.)
flarn2006

4

Khi bạn di chuyển một tệp, bạn nói với hệ điều hành thư mục mà bạn muốn đặt nó hoặc đường dẫn mới mà bạn muốn cung cấp cho nó.

Bạn đã nói với HĐH "/ openvpn". Vì vậy, nó sẽ thực hiện chính xác điều đó - kiểm tra xem / openvpn có tồn tại không (có nghĩa là một đối tượng được gọi là "openvpn" nằm trong thư mục gốc) và là một thư mục, và nếu vậy hãy di chuyển tệp của bạn vào đó, hoặc nếu không thì / openvpn là một tệp hoặc không tồn tại, đổi tên và di chuyển tệp của bạn để bây giờ có thể truy cập dưới dạng / openvpn.

Những gì bạn muốn nó làm là di chuyển nó vào trong một thư mục "openvpn", được tìm thấy trong thư mục hiện tại của bạn , không phải là một trong thư mục gốc của hệ thống tệp (đó là những gì hàng đầu "/" biểu thị). Vì vậy, bạn phải trỏ đến thư mục đó trong lệnh di chuyển, không phải đường dẫn tuyệt đối "/ openvpn". Bất kỳ trong số này sẽ làm việc:

  • mv MyFile.conf openvpn - xem trong thư mục hiện tại của tôi cho "openvpn" này
  • mv MyFile.conf /etc/openvpn - tìm đường dẫn tuyệt đối / etc / openvpn
  • mv MyFile.conf openvpn/ - tìm trong thư mục hiện tại của tôi, để biết một thư mục gọi là openvpn
  • mv MyFile.conf ./openvpn - làm cho "thư mục hiện tại" thậm chí còn rõ ràng hơn

Phiên bản ngắn - có lẽ bạn đã sử dụng "/" có nghĩa là "thư mục hiện tại của tôi", do đó "/ openvpn" có nghĩa là "openvpn trong thư mục hiện tại của tôi". Nhưng một "/" hàng đầu chỉ có nghĩa là "thư mục gốc", vì vậy "/ openvpn" có nghĩa là "openvpn trong thư mục gốc". Những gì bạn cần chỉ đơn giản là sử dụng "openvpn" hoặc "openvpn /", nghĩa là "openvpn trong thư mục hiện tại của tôi ".


1
Không chắc chắn tại sao câu trả lời này đã bị hạ cấp; nó đúng và tôi thực sự nghĩ nó rõ ràng nhất
Các cuộc đua nhẹ nhàng trong quỹ đạo

1

Bất kỳ đường dẫn nào bắt đầu bằng /một đường dẫn tuyệt đối, không tương đối.

Nếu tất cả các đường dẫn luôn luôn liên quan đến thư mục hiện tại, bạn sẽ cd /etcở vị trí đầu tiên như thế nào? Bạn phải cd ../../../../../etcvà hy vọng rằng đã đủ mức .., hoặc cứ tiếp tục làm cd ..cho đến khi bạn đến thư mục gốc.

Hoặc bạn cần một số cú pháp khác để diễn tả các đường dẫn tuyệt đối. Nhưng Unix đã quyết định về /ý nghĩa tuyệt đối, bất cứ điều gì khác liên quan đến thư mục làm việc hiện tại của quy trình. Vì vậy, mv MyFile.txt openvpnsẽ làm việc.


Và không, nó sẽ không hoạt động tốt để suy ra tuyệt đối so với tương đối từ các tệp hiện có hay không. Chúng tôi không muốn mkdircác cuộc gọi hệ thống để đường dẫn điều trị khác nhau từ chdirhoặc renamehệ thống các cuộc gọi, và làm cho mvchương trình làm điều đó chỉ để lại chỗ cho sự mâu thuẫn giữa mvvà một số chương trình khác mà phải mất một tên tập tin đầu ra.

mvđã đặc biệt bởi vì khi rename()đích là một thư mục, nó sẽ nối tên tệp nguồn vào thư mục đích đó và thử lại. Nhưng lưu ý rằng một chiến lược thực hiện đơn giản dựa trên rename()cuộc gọi hệ thống đầu tiên không thành công với EEXISThoặc EISDIR. Vì vậy, chúng ta phải biết liệu một đường dẫn là tương đối hay tuyệt đối trước khi kiểm tra hệ thống tập tin.

(Unix ban đầu chạy trên các máy tính chậm, trong đó kiểm tra thêm nếu một thư mục tồn tại có thể có nghĩa là thêm I / O nếu nó không được lưu trong bộ nhớ cache hoặc gây áp lực nhiều hơn cho bộ nhớ đệm thư mục. Nhưng tôi nghĩ rằng các đối số chính xác / đúng đắn là đủ để giải thích lý do tại sao bạn đoán trước không phải là một cách hợp lý để hệ thống hoạt động mà không cần dùng đến các lý lẽ hiệu quả lịch sử.)


1

Để hoàn thành các câu trả lời khác:

mv file.txt /location

giống như đối với Windows

mv file.txt c:\location

Hệ thống tập tin trong linux được cho là phù hợp với tiêu chuẩn phân cấp hệ thống tập tin hoặc viết tắt là FHS . nó giúp bạn biết nơi tập tin nên được đặt tùy thuộc vào bản chất và nội dung của nó.

Thư mục đầu tiên (tương đương với c:trong Windows) là /.

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.