จะตัดสินใจได้อย่างไรว่า mv ย้ายเข้าสู่สารบบแทนที่จะแทนที่สารบบ?


18

/helloว่าฉันมีไดเรกทอรี

mv /hello /hello2แล้วฉันจะทำอย่างไร

ฉันกำลังจะย้าย/helloไปที่/hello2/hello? หรือฉันจะย้าย/helloไปที่/hello2?

ดูเหมือนว่าเมื่อฉันทำสิ่งนี้ฉันได้รับผลลัพธ์ที่ไม่สอดคล้องกัน


1
ผลลัพธ์ไม่สอดคล้องกันในกรณีใด ดูเหมือนว่าเมื่อใดก็ตามที่มีไดเรกทอรีเป้าหมายอยู่มันจะย้ายไปยังไดเรกทอรีเป้าหมายมิฉะนั้นจะถูกเปลี่ยนชื่อ
jmathew

นั่นไม่สอดคล้องกัน คำสั่งเดียวกันควรทำในสิ่งเดียวกัน นั่นหมายถึงคำสั่งไม่ชัดเจน
user4951

นั่นไม่ได้ขัดแย้งกันจริงๆเพราะมันทำหน้าที่อย่างสม่ำเสมอภายในบริบท แม้ว่าฉันจะเห็นว่ามันสับสน แต่ยิ่งฉันคิดถึงมันมากขึ้นคำสั่งจะต้องเป็นเช่นนั้นเพื่อให้สามารถทำงานได้ในทุกสถานการณ์
jmathew

ฉันอยากจะบอกว่ามันเป็นวิธีการที่ได้รับการออกแบบและมันยังมีตรรกะ .. ถ้าคุณใช้mvกับไฟล์มันทำสิ่งเดียวกันเพียงแค่เปลี่ยนชื่อใหม่ แต่mvด้วยไดเรกทอรีมันไม่ดีที่จะลบไดเรกทอรีทั้งหมดด้วยไดเรกทอรีย่อยเพราะmvคำสั่งเดียวที่ไม่ ปลอดภัย test1/test2ดังนั้นมันจะถูกย้ายไปเป็น แต่ถ้าคุณยังต้องการที่จะประสบความสำเร็จมันเขียนaliasที่ตรวจสอบว่าพารามิเตอร์ที่กำหนดเป็นไดเรกทอรีและจากนั้นทำ rm -rf ไดเรกทอรีและใช้mvคำสั่ง แต่ใช้ความเสี่ยงของคุณเอง
harish.venkat

ฉันสงสัยว่าตัวอย่างของคุณขึ้นอยู่กับการจำสิ่งที่เกิดขึ้นในอดีตโดยอ้างอิงจาก "ดูเหมือนว่าฉันจะทำอะไรแบบนี้" ถ้าทั้งคู่/helloและ/hello2เป็นไดเรกทอรีฉันก็สังเกตเห็นว่าcp /hello /hello2มันเป็นไดเรกทอรีที่ไม่สอดคล้องกัน ขึ้นอยู่กับว่ามีการรวมกันของเครื่องหมายทับต่อท้ายบางครั้งเนื้อหาของ/helloจะถูกคัดลอกลงใน/hello2และบางครั้งไดเรกทอรีตัวเองจะถูกคัดลอกมา
Izkata

คำตอบ:


16

mv a bความพยายามที่จะย้ายaเข้าbถ้าbเป็นไดเรกทอรีหรือ symlink ไปยังไดเรกทอรี มิฉะนั้นก็จะเปลี่ยนชื่อ (หรือคัดลอกและลบถ้าบนระบบไฟล์ที่แตกต่างกัน) เพื่อab

ในการรับผลลัพธ์ที่สอดคล้องกันเพื่อย้ายไฟล์ไปยังไดเรกทอรีคุณสามารถทำได้:

mv file dir/

หรือ

mv file dir/.

ถ้าdirไม่ได้อยู่ที่คุณจะได้รับข้อผิดพลาดและมันจะไม่เปลี่ยนชื่อไปfiledir

ในทางกลับกันถ้าคุณต้องการทำrenameโดยไม่ต้องกังวลว่าไฟล์ปลายทางนั้นมีอยู่ในไดเรกทอรีหรือไม่ด้วย GNU mv คุณสามารถทำได้:

mv -T file dest

ในกรณีนั้นfileจะไม่ถูกย้ายเข้าไปในdestหากdestเป็นไดเรกทอรี อย่างไรก็ตามหากทั้งสองfileและdestเป็นไดเรกทอรีและdestว่างเปล่าfileจะถูกเปลี่ยนชื่อเป็นdest(และdestลบออกดั้งเดิม) หากทั้งสองเป็นไดเรกทอรีและdestไม่ว่างเปล่าmv -Tจะบ่น

เดียวกันถ้าfileและdestมีไม่ไดเรกทอรี (และที่มี symlinks รวมทั้ง symlinks ไปยังไดเรกทอรี) fileจะเปลี่ยนชื่อdest(แม้ว่าคุณจะได้รับพรอมต์ถ้าคุณไม่ได้รับอนุญาตให้เขียนdest) และเดิมdestจะถูกลบออก มีความแตกต่างmv file destในกรณีที่destsymlink ไปยังไดเรกทอรี ด้วย-T, fileมีการเปลี่ยนชื่อไปdestแต่ไม่-T, จะถูกย้ายไปลงในไดเรกทอรีที่ชี้ไปตามfiledest

ดังนั้นเพื่อสรุปหลังจากmv -T file destนั้นfileจะถูกเปลี่ยนชื่อเป็นdestหรือคุณจะได้รับข้อความแสดงข้อผิดพลาด (หรือพรอมต์) หากคำสั่งประสบความสำเร็จต้นฉบับdestหากมีอยู่ก่อนจะถูกลบออก


14

สิ่งนี้ขึ้นอยู่กับว่ามีไดเรกทอรีชื่อ '/ hello2' อยู่แล้วหรือไม่

หาก / hello2 มีอยู่แล้วและเป็นไดเรกทอรีการย้ายจะย้าย / hello ไปที่ / hello / hello2 เสมอ

หาก / hello2 ไม่มีอยู่การย้ายจะเปลี่ยนชื่อ / hello เป็น / hello2 เสมอ

หาก / hello2 มีอยู่แล้วและเป็นไฟล์คุณจะได้รับข้อผิดพลาด "ไม่สามารถเขียนทับไดเรกทอรีที่ไม่ใช่ 'hello2' ด้วยไดเรกทอรี 'hello'


3

ฉันลองสิ่งเหล่านี้

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'

หวังว่านี่จะอธิบายทุกอย่าง -vเป็นโหมด verbose

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