แนวทางปฏิบัติที่ดีที่สุดเพื่อดำเนินการต่อ mv


13

ฉันใช้เทอร์มินัลเพื่อคัดลอกไฟล์จากไดรฟ์หนึ่งไปยังอีกไดรฟ์

sudo mv -vi /location/to/drive1/ /location/to/drive2/

อย่างไรก็ตามที่หยุดทันทีในขณะที่บางชั่วโมงในนั้นและไม่มีข้อผิดพลาดหลังจากสร้างไดเรกทอรี

โซลูชันของฉันเองที่มักจะเป็นการผสมผสานระหว่างการแฮ็กและการเปรียบเทียบซึ่งส่วนใหญ่เป็นเวลาที่ยุ่งเหยิงเพราะตอนนี้ฉันต้องกู้คืนจากการทำสำเนากลางโดยไม่ทราบว่าไฟล์ใดหายไป (เขียนด้วยความยาวหนึ่งบรรทัดสำหรับ zsh สคริปต์นี้ใช้ไม่ได้กับการทุบตีตามที่เขียนไว้):

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

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

มีวิธีปฏิบัติที่ดีที่สุดวิธีการกู้คืนจาก mv ขัดจังหวะหรือไม่


ฉันเขียนสคริปต์ที่คล้ายกันซึ่งใช้cmpแทนการแฮช มันมีการอ้างอิงและปัญหาเดียวกันกับwhile readGilles ที่กล่าวถึง นอกจากนี้ยังช้าและ verbose แต่จะทำให้เนื้อที่ว่างบนดิสก์เร็วกว่าวิธี rsync เนื่องจากมีการย้ายไฟล์จากแหล่งที่มาเมื่อมีการเรียกใช้ มันอาจเป็นแรงบันดาลใจให้กับผู้กล้า
joeytwiddle

3
@joeytwiddle ข้อเสนอ rsync --delete-during receiver deletes during the transferและยังมีหลายทางเลือกที่มีประโยชน์อื่น ๆ--delete --delete-before --delete-delay --delete-after --delete-excluded: ดังนั้นใช่ rsync เป็นทางเลือกที่ดีที่สุด
NotAnUnixNazi

ฉันต้องคิดถึงบางสิ่ง ทำไมไม่เพียงทำซ้ำmvคำสั่งเดียวกันเท่านั้น? อาจ*ผนวกเข้ากับเส้นทางของแหล่งที่มาหากแหล่งต้นฉบับเป็นไดเรกทอรี
jpa

@isaac ไม่ฉันกลัวว่าrsync --delete*จะเป็นหายนะ ! มันจะลบสิ่งdestที่ไม่ได้อยู่ในปัจจุบันsrcดังนั้นไฟล์ทั้งหมดที่ถูกย้ายเรียบร้อยแล้วในความพยายามครั้งก่อนจะถูกลบ! คุณอาจคิดว่าrsync --remove-source-filesฉันเห็นด้วยที่จะเป็นทางเลือกที่ดี ( more1 , more2 )
joeytwiddle

@joeytwiddle No rsync --deleteจะลบเฉพาะไฟล์อื่น ๆที่ไม่ได้เป็นส่วนหนึ่งของแหล่งที่มา จาก [man rsync] () * ลบไฟล์ที่ไม่เกี่ยวข้องจาก dest dirs * ทำความเข้าใจความหมายที่ไม่เกี่ยวข้อง : ไม่ได้รับการซิงค์ และใช่ rsync ยังให้วิธีการลบไฟล์ต้นฉบับหลังจากที่พวกเขาถูกส่งอย่างถูกต้อง
NotAnUnixNazi

คำตอบ:


46

ลืมเกี่ยวกับการพยายาม reinvent rsync และใช้ rsync

sudo rsync -av /location/to/drive1/ /location/to/drive2/

/location/to/drive2/drive1ตรวจสอบให้แน่ใจว่าคุณใช้เฉือนท้ายกับแหล่งที่มามิฉะนั้นก็จะคัดลอกไป

rm -rf /location/to/drive1/ตรวจสอบอีกครั้งว่าคำสั่งประสบความสำเร็จทำงานแล้ว

คำสั่งดังกล่าวจะเขียนทับไฟล์ใด ๆ drive2จากนิยาย หากคุณต้องการให้ผู้ใช้ข้ามไฟล์ที่มีอยู่แล้วdrive2เช่นmv -iกันมันมีความซับซ้อนมากขึ้นเพราะตอนนี้คุณต้องแยกความแตกต่างไฟล์ที่ถูกคัดลอกแล้วและไฟล์ที่ยังไม่ได้ทำ คุณสามารถส่ง--ignore-existingตัวเลือกเพื่อ rsync เพื่อข้ามไฟล์ที่มีอยู่แล้วในปลายทางโดยไม่คำนึงถึงเนื้อหาของพวกเขา โปรดทราบว่าหากต้นฉบับmvถูกขัดจังหวะในระหว่างการสร้างไฟล์ไฟล์นี้จะยังคงอยู่ในสถานะครึ่งสำเนาของมัน (ในขณะที่ไฟล์เปล่าrsync -aจะทำการคัดลอกเสร็จสิ้น)

หากคุณต้องการจำลองพฤติกรรมที่แน่นอนของmv -iรวมถึงการกระตุ้นเตือนก็สามารถทำได้ แต่มีความซับซ้อนมากขึ้น

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

สำหรับการอ้างอิงในอนาคตฉันไม่แนะนำให้ใช้mvสำหรับการเคลื่อนย้ายข้ามไดรฟ์ขนาดใหญ่เพราะมันยากที่จะควบคุมว่าจะเกิดอะไรขึ้นถ้ามันถูกขัดจังหวะ ใช้ rsync เพื่อทำการคัดลอกแล้วลบต้นฉบับ


RSync มีสัญญาอะไรที่ทำให้ mv นั้นไม่ได้ทำ?
สิ่งที่

4
ดีเช่นrsyncทำในสิ่งที่คุณพยายามทำในขณะที่mvไม่ นอกจากนี้: การคัดลอกระหว่างเครื่องต่าง ๆ ; การบีบอัดเพื่อถ่ายโอน การข้ามไฟล์ที่มีอยู่ที่ปลายทางขึ้นอยู่กับความเท่าเทียมกันของการประทับเวลาหรือแฮชตาม; การจัดการที่กำหนดความเป็นเจ้าของสิทธิ์ลิงค์และไฟล์พิเศษ เป็นต้นlinux.die.net/man/1/rsync
Silly Freak

1
@SyncFreak ฉันควรสรุปจากที่ฉันควรใช้ rsync แทน mv ไม่เพียง แต่เป็น Gilles ที่พูดถึงการข้ามไดรฟ์ แต่การดำเนินการใด ๆ เนื่องจากขอบเขตของ "มีขนาดใหญ่เกินไป" ค่อนข้างเป็นอัตนัยและหากเกิดปัญหาขึ้น มันจะได้รับการแก้ไขโดย rsync หรือไม่
สิ่งที่

9
ดีเมื่อฉันย้ายไฟล์หรือไดเรกทอรีภายในพาร์ทิชันเดียวฉันมักจะใช้mv(หรือตัวจัดการไฟล์) เพราะมันเป็นเพียงการย้ายการอ้างอิงไปยังไฟล์ / ไดเรกทอรี หากฉันต้องการทำการถ่ายโอนข้อมูลจริงฉันจะใช้rsyncหากสิ่งใดสิ่งหนึ่งต่อไปนี้เป็นจริง: 1) ฉันกำลังย้ายไฟล์มากกว่าที่ฉันสามารถตรวจสอบการถ่ายโอนที่ถูกต้องได้อย่างรวดเร็ว 2) ฉันคาดหวังว่าฉันจะต้องทำให้ไฟล์ซิงค์อยู่เสมอ; 3) ฉันคาดว่าการถ่ายโอนอาจถูกขัดจังหวะ ประเด็นของฉันคือสำหรับกรณีการใช้งานที่คุณนำเสนอในคำถามrsyncเป็นเพียงเครื่องมือที่เหมาะสมและmvหรือcpไม่
Silly Freak

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