ทำไม `ไฟล์ mv / dir` ไม่ย้ายไฟล์ไปยังไดเรกทอรีย่อยของไดเรกทอรีการทำงานปัจจุบัน?


10

ฉันอยู่ใน/etcไดเรกทอรีของฉันและพิมพ์คำสั่ง

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

ฉันคิดว่าจะย้ายไฟล์ไปยังไดเรกทอรีopenvpnซึ่งเป็นไดเรกทอรีย่อยของ/etcไดเรกทอรี อย่างไรก็ตามนั่นไม่ได้เป็นสิ่งที่เกิดขึ้น ทั้งหมดที่ฉันสามารถยืนยันได้คือคำสั่งที่ได้ดำเนินการ

คำตอบ:


51

ที่จัดไว้ให้ไดเรกทอรีที่มีชื่อนี้ไม่ได้อยู่ที่คุณเปลี่ยนชื่อไฟล์ที่จะอยู่ในไดเรกทอรีรากของคุณopenvpn /หากต้องการคืนค่านี้ให้เรียกใช้:

sudo mv /openvpn /etc/MyFile.conf

หากไดเรกทอรีไม่มีอยู่คุณย้ายไฟล์ไว้ภายในแล้วการพลิกกลับคือ:

sudo mv /openvpn/MyFile.conf /etc/

หากต้องการย้ายไปยังไดเรกทอรีย่อยที่มีอยู่ของไดเรกทอรีปัจจุบันคุณสามารถเรียกใช้หนึ่งในเหล่านี้ - ผู้ใช้เส้นทางสัมพัทธ์ :

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

.เป็นลิงค์ไปยังไดเรกทอรีปัจจุบันดังนั้น./ที่จุดเริ่มต้นของเส้นทางหมายถึง“ ในไดเรกทอรีนี้” เครื่องหมายทับที่ท้ายหมายความว่าopenvpnเป็นไดเรกทอรีและคุณต้องการย้ายไฟล์ภายใน หากคุณไม่ได้ให้มันไฟล์จะถูกย้ายไปเป็นมันถ้าไดเรกทอรีที่มีชื่อนี้มีอยู่อื่นไฟล์จะถูกเปลี่ยนชื่อopenvpnไป เมื่อ/สิ้นสุดแล้วmvจะเตือนคุณหากไดเรกทอรีหายไปและไม่เปลี่ยนชื่อดังนั้นจึงเป็นวิธีที่ปลอดภัยหากคุณไม่ต้องการเปลี่ยนชื่อ

หากเส้นทางของคุณเริ่มต้นด้วย/ในทางกลับกันมันเป็นเส้นทางที่สมบูรณ์โดยไม่คำนึงถึงไดเรกทอรีการทำงานปัจจุบันมันจะสัมพันธ์กับไดเรกทอรีราก/เสมอ การใช้พา ธ สัมบูรณ์สำหรับทั้งไฟล์และปลายทางคำสั่งของคุณจะเป็นดังนี้:

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

อ่านเพิ่มเติม


2
หากคุณไม่ทราบว่ามีไดเรกทอรีอยู่หรือไม่ให้ลองใช้sudo mv /openvpn/MyFile.conf /etc/คำสั่งก่อน ในสถานการณ์ที่น่าเป็นไปได้ที่ไดเรกทอรีไม่มีอยู่มันจะทำให้คุณเกิดข้อผิดพลาด (อาจเป็น "ไม่ใช่ไดเรกทอรี") และไม่แตะระบบไฟล์ sudo mv /openvpn /etc/MyFile.confจากนั้นคุณก็สามารถทำได้
flarn2006

9

คุณต้องใช้

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

การย้ายMyFile.confไฟล์ลงในไดเรกทอรีย่อยของopenvpn/etc/

ในทางกลับกัน

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

จะย้ายไฟล์ไปยัง/ไดเรกทอรีเป็นopenvpn(เช่นเปลี่ยนชื่อเป็นopenvpn) แทน (สมมติว่า/openvpnไม่มีไดเรกทอรีอยู่)


3
นอกจากนี้เครื่องหมายสแลชที่ส่วนท้ายของคำสั่งแรกจะเป็นทางเลือก แต่ฉันคิดว่ามันเป็นนิสัยที่ดีที่จะเข้าไปเพราะมันจะทำให้คำสั่งล้มเหลวถ้าไม่ใช่ไดเรกทอรีแทนที่จะสร้างสถานการณ์ที่สับสนเช่น OP อธิบาย (หรือแย่กว่าเขียนทับไฟล์สำคัญ)
flarn2006

4

เมื่อคุณย้ายไฟล์คุณจะบอกไดเรกทอรีของระบบปฏิบัติการที่คุณต้องการใส่หรือเส้นทางใหม่ที่คุณต้องการให้

คุณบอกระบบปฏิบัติการ "/ openvpn" ดังนั้นมันจะทำอย่างนั้น - ตรวจสอบว่า / openvpn มีอยู่(หมายถึงวัตถุที่เรียกว่า "openvpn" ที่อยู่ในไดเรกทอรีราก) และเป็นไดเรกทอรีและถ้าเป็นเช่นนั้นให้ย้ายไฟล์ของคุณเข้าไปหรืออื่น ๆ ถ้า / openvpn เป็นไฟล์หรือ ไม่มีอยู่ให้เปลี่ยนชื่อและย้ายไฟล์ของคุณเพื่อให้สามารถเข้าถึงได้ในฐานะ / openvpn

สิ่งที่คุณต้องการให้ทำคือย้ายไปไว้ในไดเรกทอรี "openvpn" ซึ่งจะพบได้ในไดเรกทอรีปัจจุบันของคุณไม่ใช่ในไดเรกทอรีรากของระบบไฟล์ (ซึ่งเป็นสิ่งที่สำคัญ "/" นำไปสู่) ดังนั้นคุณต้องชี้ไปที่ dir นั้นในคำสั่ง move ไม่ใช่พา ธ สัมบูรณ์ "/ openvpn" สิ่งเหล่านี้จะได้ผล:

  • mv MyFile.conf openvpn - ดู dir ปัจจุบันของฉันสำหรับ "openvpn"
  • mv MyFile.conf /etc/openvpn - มองหาพา ธ สัมบูรณ์ / etc / openvpn
  • mv MyFile.conf openvpn/ - ดูใน dir ปัจจุบันของฉันสำหรับ dir ที่เรียกว่า openvpn
  • mv MyFile.conf ./openvpn - ทำให้ "dir ปัจจุบัน" ชัดเจนยิ่งขึ้น

เวอร์ชั่นสั้น - คุณอาจใช้ "/" เพื่อหมายถึง "ไดเรกทอรีปัจจุบันของฉัน" ดังนั้น "/ openvpn" หมายถึง "openvpn ซึ่งอยู่ในไดเรกทอรีปัจจุบันของฉัน" แต่ "/" นำหน้าเท่านั้นหมายถึง "ไดเรกทอรีราก" ดังนั้น "/ openvpn" หมายถึง "openvpn ในไดเรกทอรีราก" สิ่งที่คุณต้องการคือใช้ "openvpn" หรือ "openvpn /", หมายถึง "openvpn ในไดเรกทอรีปัจจุบันของฉัน"


1
ไม่แน่ใจว่าทำไมคำตอบนี้จึงถูกลดระดับลง ถูกต้องและฉันคิดว่ามันชัดเจนที่สุด!
Lightness Races ที่ Orbit

1

เส้นทางใด ๆ ที่ขึ้นต้นด้วย/เป็นเส้นทางที่แน่นอนไม่ใช่แบบสัมพัทธ์

หากเส้นทางทั้งหมดสัมพันธ์กับไดเรกทอรีปัจจุบันคุณจะcd /etcเริ่มต้นอย่างไร? คุณจะต้องcd ../../../../../etcและหวังว่ามันจะมีระดับเพียงพอ..หรือทำcd ..ต่อไปจนกว่าคุณจะไปที่ไดเรกทอรีราก

หรือคุณต้องการไวยากรณ์อื่นเพื่อแสดงเส้นทางที่สมบูรณ์ แต่ยูนิกซ์ตัดสินใจเกี่ยวกับ/ความหมายที่แท้จริงสิ่งอื่นใดที่เกี่ยวข้องกับไดเรกทอรีการทำงานปัจจุบันของกระบวนการ ดังนั้นmv MyFile.txt openvpnจะทำงาน


และไม่มันจะไม่ทำงานได้ดีเมื่อเทียบกับไฟล์ที่มีอยู่หรือไม่ เราไม่ต้องการให้การmkdirเรียกของระบบเพื่อจัดการกับเส้นทางที่แตกต่างจากchdirหรือการrenameเรียกของระบบและทำให้mvโปรแกรมทำเพียงออกจากพื้นที่สำหรับความไม่สอดคล้องกันระหว่างmvและโปรแกรมอื่น ๆ ที่ใช้ชื่อไฟล์ที่ส่งออก

mvมีความพิเศษอยู่แล้วเพราะเมื่อrename()ปลายทางคือไดเรกทอรีมันจะผนวกชื่อไฟล์ต้นฉบับไปยังไดเรกทอรีปลายทางนั้นและลองอีกครั้ง แต่สังเกตเห็นว่ากลยุทธ์การดำเนินง่ายๆอาศัยแรกrename()เรียกระบบล้มเหลวด้วยหรือEEXIST EISDIRดังนั้นเราต้องรู้ว่าพา ธ นั้นสัมพันธ์กันหรือสัมบูรณ์ก่อนตรวจสอบระบบไฟล์

(ยูนิกซ์ยุคแรกทำงานบนคอมพิวเตอร์ที่ช้าซึ่งมีการตรวจสอบเพิ่มเติมว่ามีไดเรกทอรีอยู่อาจหมายถึง I / O พิเศษถ้ามันไม่ได้ถูกแคชหรือมีแรงกดดันต่อการแคชไดเรกทอรีมากขึ้น แต่ฉันคิดว่าเหตุผลด้านความมีเหตุผล / เหตุผลก็เพียงพอแล้ว ไม่ใช่วิธีที่เป็นไปได้สำหรับระบบที่จะทำงานโดยไม่ต้องใช้ข้อโต้แย้งเชิงประสิทธิภาพในอดีต)


1

หากต้องการคำตอบอื่น ๆ ให้สมบูรณ์:

mv file.txt /location

เป็นเช่นเดียวกับสำหรับ Windows

mv file.txt c:\location

ระบบแฟ้มในลินุกซ์เป็นความคิดที่เป็นไปตามมาตรฐานลำดับชั้นของระบบแฟ้มหรือFHSสำหรับระยะสั้น ช่วยให้คุณทราบว่าควรวางไฟล์ไว้ที่ใดขึ้นกับลักษณะและเนื้อหาของไฟล์

โฟลเดอร์แรก (เทียบเท่าc:ใน Windows) /เป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.