วิธีย้ายโฟลเดอร์ในยูนิกซ์โดยใช้ mv เฉพาะเมื่อเป้าหมายอยู่ในไดรฟ์เดียวกัน


10

ฉันต้องการย้ายโฟลเดอร์โดยใช้คำสั่ง unix mv แต่หากเป้าหมายอยู่ในไดรฟ์เดียวกันหรือระบบไฟล์เดียวกัน อะไรคือแนวทางที่ดีที่สุด

linux  bash  shell  unix  mv 

1
ขับรถมาที่นี่คุณหมายถึง "อุปกรณ์" หรือไม่ เช่นฮาร์ดดิสก์เดียวกันหรือไม่
Kent

อุปกรณ์เดียวกันใช่

คำตอบ:


9

ขึ้นอยู่กับวิธีการตรวจสอบว่าสองไดเรกทอรีหรือไฟล์เป็นของระบบไฟล์เดียวกัน ( https://unix.stackexchange.com/ ):

ในเชลล์สคริปต์บน Linux สามารถทำได้ด้วยstat :

stat -c "%d" /path  # returns the decimal device number

คุณสามารถ:

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

แล้วเปรียบเทียบ

คุณสามารถเขียนดังนี้:

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

ตัวเลือกอื่น ๆ นำมาจากคำถาม Stackexchange ด้วย :

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

คุณคิดว่ามันเข้ากันได้กับการแจกแจงลินุกซ์หรือไม่?

เพียงสำหรับการแพร่กระจายการปฏิบัติที่ดีกว่าใช้แทน$(...) `...`ภายหลังถูกคัดค้านในอดีต
Shahbaz

ขอบคุณ @Shahbaz เพียงแก้ไขด้วยคำแนะนำของคุณ!
fedorqui

@zapp ฉันไม่รู้ควรทดสอบมัน ประสบการณ์ของฉันกับstatบอกฉันว่าบางครั้งก็เป็นเรื่องยากอย่างน้อยกับ SunOS แต่การเป็น Linux ฉันหวังว่ามันเข้ากันได้ ด้วย Ubuntu 12 ของฉันมันใช้ได้
fedorqui

%dผลลัพธ์นี้ให้ค่าที่แตกต่างกันสำหรับ dirs ที่แตกต่างกัน (พาร์ติชันเดียวกัน) ลองกับคุณ/และ/tmp
Kent

2

นี่อาจไม่ใช่วิธีที่สะอาดที่สุด แต่คุณสามารถใช้ข้อเท็จจริงที่ว่าฮาร์ดลิงก์ไม่สามารถสร้างขึ้นระหว่างไดรฟ์ได้

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.