ฉันเพิ่ง“ mv” แก้ไขไดเร็กตอรี่ 49GB ไปยังพา ธ ไฟล์ที่ไม่ดีเป็นไปได้หรือไม่ที่จะกู้คืนสถานะดั้งเดิมของไฟล์?


58

ฉันมี (ดีฉันมี ) ไดเรกทอรี:

/media/admin/my_data

มันมีขนาดประมาณ 49GB และมีไฟล์นับหมื่นไฟล์ ไดเร็กทอรีคือจุดเมานต์ของพาร์ติชัน LUKS ที่ใช้งานอยู่

ฉันต้องการเปลี่ยนชื่อไดเรกทอรีเป็น:

/media/admin/my_data_on_60GB_partition

ฉันไม่ได้ตระหนักถึงเวลา แต่ฉันออกคำสั่งจากไดเรกทอรีบ้านดังนั้นฉันจึงทำ:

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

ดังนั้นแล้วmvโปรแกรมเริ่มต้นที่จะย้ายและเนื้อหาของมันไปยังไดเรกทอรีใหม่/media/admin/my_data~/my_data_on_60GB_partition

ฉันใช้Ctrl+ Cเพื่อยกเลิกคำสั่งส่วนหนึ่งผ่านดังนั้นตอนนี้ฉันมีกลุ่มของไฟล์ทั้งหมดข้ามไดเรกทอรี:

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

และ

/media/admin/my_data           <---- about 47GB of orig files in here    

ไดเรกทอรีใหม่~/my_data_on_60GB_partitionและไดเรกทอรีย่อยบางส่วนนั้นเป็นของ root
ฉันสมมติว่าmvโปรแกรมจะต้องคัดลอกไฟล์เป็นรูทในขั้นต้นและหลังจากการถ่ายโอนchownกลับไปยังบัญชีผู้ใช้ของฉัน

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

นั่นคือฉันสามารถเรียกใช้:

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

หรือฉันควรยกเลิกการพยายามกู้คืนเนื่องจากไฟล์อาจเสียหายและเสร็จสมบูรณ์บางส่วน ฯลฯ

  • ระบบปฏิบัติการ - Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25

36
รับเป็นนิสัยเมื่อตื่นตระหนกในการพิมพ์Control-Z(เพื่อหยุด) Control-Cมากกว่า ในกรณีนี้คุณจะสามารถดูไฟล์ที่ถูกถ่ายโอนในเวลานั้นและเพื่อให้ทราบว่าไฟล์ใดที่ถูกคัดลอกเพียงบางส่วนเท่านั้น จากนั้นคุณสามารถตัดสินใจอย่างใจเย็นเกี่ยวกับวิธีดำเนินการ (ใช้kill -stopสำหรับกระบวนการที่ไม่อยู่ใน tty)
meuh

1
2GB + 47GB = 60GB ???
59

7
(2GB + 47GB) < 60GB@tbodt ความจุพาร์ติชั่นคือ 60GB ขนาดของโฟลเดอร์และเนื้อหา: 49GB
the_velour_fog

คำตอบ:


87

เมื่อมีการย้ายไฟล์ระหว่างระบบไฟล์, mvไม่ลบไฟล์ก่อนที่จะเสร็จสิ้นการคัดลอกและการประมวลผลไฟล์ตามลำดับ (ผมเริ่มบอกว่ามันสำเนาแล้วลบไฟล์ในการเปิดแต่ละ แต่ที่ไม่รับประกัน - ที่ GNU น้อยmvสำเนาแล้วลบแต่ละคำสั่ง อาร์กิวเมนต์ lineในทางกลับกันและPOSIX ระบุพฤติกรรมนี้ ) ดังนั้นคุณควรมีไฟล์ไม่ครบหนึ่งไฟล์ในไดเรกทอรีเป้าหมายและไฟล์ต้นฉบับจะยังคงอยู่ในไดเรกทอรีต้นฉบับ

หากต้องการย้ายสิ่งต่าง ๆ กลับไปให้เพิ่มการ-iตั้งค่าสถานะดังนั้นmvอย่าเขียนทับอะไรเลย:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(สมมติว่าคุณไม่มีไฟล์ที่ซ่อนอยู่ที่จะกู้คืนจาก~/my_data_on_60GB_partition/) หรือดีกว่า (เมื่อคุณค้นพบว่าคุณอาจมีไฟล์จำนวนมากที่รอการลบ) เพิ่มการ-nตั้งค่าสถานะเพื่อmvไม่ให้เขียนทับอะไรเลย แต่ไม่มี ถามคุณเกี่ยวกับมัน

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

คุณสามารถเพิ่ม-vธงเพื่อดูว่ากำลังทำอะไรอยู่

ด้วย POSIX-compliant ใด ๆmvโครงสร้างไดเรกทอรีดั้งเดิมควรจะยังคงเหมือนเดิมดังนั้นคุณสามารถตรวจสอบได้ว่า - และลบ/media/admin/my_data... (ในกรณีทั่วไปฉันคิดว่าmv -nตัวแปรนั้นเป็นวิธีที่ปลอดภัย - สามารถจัดการทุกรูปแบบmvได้ รวมถึงเช่น mv /media/admin/my_data/* my_data_on_60GB_partition/ .)

คุณอาจต้องคืนค่าสิทธิ์บางอย่าง คุณสามารถทำen masseใช้chownและchmodหรือเรียกคืนได้จากการสำรองข้อมูลที่ใช้getfaclและsetfacl(ขอบคุณSato Katsuraสำหรับการแจ้งเตือน )


ขอบคุณ Stephen Kitt นั่นเป็นความช่วยเหลือที่ยิ่งใหญ่! ฉันสามารถใช้findเพื่อค้นหาและตั้งค่าการอนุญาต มีไฟล์จำนวนมากในไดเรกทอรีใหม่ที่มีช่องว่างในชื่อไฟล์ แต่ไม่มีไฟล์ที่ซ่อนอยู่ - ที่ฉันรู้จัก คุณคิดว่า glob ในคำสั่งsudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/จะขยายชื่อไฟล์โดยไม่มีปัญหาการแยกคำ? ฉันคิดว่าฉันสามารถใช้sudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/ซึ่งฉันเชื่อว่าจะจัดการกับเส้นทางของไฟล์ด้วยช่องว่าง?
the_velour_fog

6
เพียงเพื่อให้แน่ใจว่าเมื่อสิ่งต่าง ๆ เช่น OP อธิบายเกิดขึ้นฉันใช้rsyncแทนดังนั้นมันจะตรวจสอบความสมบูรณ์ของไฟล์ทั้งหมด แต่ก็เป็นเรื่องดีที่รู้ว่าฉันไม่ต้องการมัน
Hauleth

1
@the_velour_fog globbing จัดการช่องว่างในชื่อไฟล์โดยไม่มีปัญหา
Stephen Kitt

5
ฉันต้องการsu command mv -i ...(หรือsu /bin/mv -i ...) แทนsudo mv -i ...) ในกรณีที่ผู้ดูแลระบบ (แปลก) บางคนทำ "mv" ฟังก์ชั่นที่ทำ "mv -f" ที่ระดับระบบ (เช่น / etc / profile หรือไฟล์กว้างของระบบ) . บางสิ่งบางอย่างคำสั่ง: เริ่มต้นคำสั่ง somthing และไม่ใช่ฟังก์ชั่นหรือนามแฝงที่มีชื่อเดียวกัน (สำหรับอดีต: หนึ่งอาจเป็น (โชคไม่ดี!) และมี (มากแย่มาก!) function mv { /bin/mv -f -- "$@" }ในไฟล์ที่มีที่มาเสมอแล้ว "rm -i บางอย่าง" จะไม่ถามอะไรเลย (และเพียงแค่คัดค้านว่า "-i "file ไม่มีอยู่!) ... [ฉันเห็นสิ่งนี้ ... ตัวสั่น ]
Olivier Dulac

3
@OlivierDulac - ตัวอย่างที่สมบูรณ์แบบของเหตุใดจึงใช้วิธีปฏิบัติที่ไม่เหมาะสมในการใช้ชื่อแทนหรือสคริปต์ที่มีชื่อเหมือนกับโปรแกรมมาตรฐาน
โจ

19

หลังจากได้รับคำตอบจาก Stephen Kitt และพูดคุยเกี่ยวกับคำสั่งนี้เป็นวิธีแก้ปัญหาที่เป็นไปได้:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

ฉันตัดสินใจที่จะหยุดการทำงานจนกว่าฉันจะได้รู้ว่าเกิดอะไรขึ้นคำตอบนี้อธิบายสิ่งที่ฉันค้นพบและลงเอยด้วยการทำ

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

ในการค้นหาไฟล์ที่ใช้ร่วมกันระหว่างสองไดเรกทอรีฉันใช้งาน:

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

ผลลัพธ์นี้แนะนำว่ามีอินสแตนซ์ของไฟล์เดียวกัน 14,237 อินสแตนซ์ในไดเรกทอรีต้นทางและเป้าหมายฉันยืนยันโดยตรวจสอบไฟล์ด้วยตนเอง - ใช่มีไฟล์เดียวกันจำนวนมากในทั้งสองไดเร็กทอรี สิ่งนี้ชี้ให้เห็นว่าหลังจากmvคัดลอกไฟล์จำนวนมากไปแล้วมันจะทำการลบไฟล์ต้นฉบับ ค้นหาแบบรวดเร็วในการinfoเกี่ยวกับmvคำสั่งแสดงให้เห็นว่า

มัน [ mv] แรกใช้บางรหัสเดียวกันที่ใช้โดยcp -aการคัดลอกไดเรกทอรีและไฟล์ที่ร้องขอจากนั้น (สมมติว่าการคัดลอกประสบความสำเร็จ) มันลบต้นฉบับ หากการคัดลอกล้มเหลวส่วนที่คัดลอกไปยังพาร์ติชันปลายทางจะถูกลบออก

ฉันไม่ได้เรียกใช้คำสั่ง แต่ฉันสงสัยว่าฉันพยายามเรียกใช้หรือไม่

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

-i พรอมต์ก่อนที่จะเขียนทับมีแนวโน้มว่าจะมีการหารือมากกว่า 14,000 ครั้ง

ดังนั้นเพื่อค้นหาจำนวนไฟล์ทั้งหมดในไดเรกทอรีที่สร้างขึ้นใหม่:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

ดังนั้นถ้ามีไฟล์ปกติรวม 14238 ไฟล์ในไดเรกทอรีใหม่และ 14237 มีต้นฉบับกลับมาเหมือนกันในแหล่งที่มานั่นหมายความว่ามีเพียงหนึ่งไฟล์ในไดเรกทอรีใหม่ที่ไม่มีไฟล์เหมือนกันกลับมาในแหล่งที่มา เพื่อค้นหาว่าไฟล์นั้นเป็นอะไรฉันก็วิ่ง rsync กลับไปในทิศทางของแหล่งที่มา:

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

การตรวจสอบอย่างรวดเร็วยืนยันว่านี่เป็นไฟล์ที่มีรูปแบบไม่ถูกต้องซึ่งมีไฟล์อยู่ทั้งต้นทางและปลายทางไฟล์ปลายทาง = 64MB ดั้งเดิม = 100MB ไฟล์นี้และลำดับชั้นไดเรกทอรีของมันยังคงเป็นของรากและยังไม่ได้รับการคืนค่าสิทธิ์ดั้งเดิม

ดังนั้นโดยสรุป:

  • ไฟล์ทั้งหมดที่ mvไม่เคยเข้าถึงยังคงอยู่ในตำแหน่งเดิม (ชัด)
  • ไฟล์ทั้งหมดที่mvทำสำเนาอย่างสมบูรณ์ยังคงมีสำเนาต้นฉบับอยู่ในไดเรกทอรีต้นทาง
  • ไฟล์ที่ถูกคัดลอกเพียงบางส่วนยังคงมีไฟล์ต้นฉบับอยู่ในไดเรกทอรีต้นฉบับ

กล่าวคือไฟล์ต้นฉบับทั้งหมดยังคงไม่เปลี่ยนแปลงและวิธีแก้ปัญหาในกรณีนี้คือเพียงแค่ลบไดเรกทอรีใหม่


ว้าว ... ฉันได้อัปเดตคำตอบแล้ว-nจะดีกว่าในกรณีทั่วไป ฉันตรวจสอบmvซอร์สโค้ดมันจะลบอาร์กิวเมนต์ทีละแหล่ง
Stephen Kitt

@StephenKitt อาดี ฉันสงสัยว่าเมื่อmvใดที่การลบแหล่งที่มา ดังนั้นคำสั่งmv foo bar bazจะย้ายfooไปbaz/foo แล้วลบต้นฉบับfooจากนั้นย้ายbarไปที่baz/bar.. ?
the_velour_fog

ถูกต้องเลย; ในความเป็นจริงนั่นคือสิ่งที่POSIX ระบุ (โดยทั่วไปเพื่อให้เกิดข้อผิดพลาดใด ๆ ที่มีผลต่อการโต้แย้งแหล่งที่มาใด ๆ ออกจากลำดับชั้นของแหล่งข้อมูลทั้งหมดเหมือนเดิม)
Stephen Kitt

ฉันคิดว่าคุณสามารถใช้ diff เพื่อค้นหาไฟล์ที่ยังไม่เสร็จได้เช่นกัน
StarWeaver

1
คุณควรใช้cmpแทนdiffการเปรียบเทียบไฟล์ไบนารี นอกจากนี้การสนทนาของคุณด้านบนเหมาะสมเมื่อย้ายไฟล์ข้ามระบบไฟล์ที่แตกต่างกัน ไม่มีการคัดลอกที่เกี่ยวข้องเมื่อย้ายไฟล์ภายในระบบไฟล์เดียวกัน
Satō Katsura

4

ฉันแค่คิดว่าฉันจะแสดงความคิดเห็นว่าบางคนอาจถูกล่อลวงให้โยน 'xargs' ลงในส่วนผสมเพื่อทำสิ่งต่าง ๆ ในแบบคู่ขนาน ที่ให้ Willies ฉันและฉันชอบโซลูชัน rsync ด้านบน

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

การเพิ่ม 'xargs' ลงในส่วนผสมอาจทำให้ขั้นตอนการตรวจสอบซ้ำสองครั้งน่าปวดหัวโดยมีหลายไฟล์ในช่วงกลางการส่งผ่าน ฉันหวังว่าฉันจะมีสคริปต์ระดับระบบมากขึ้น เตือนความจำที่ดีสำหรับฉัน!

ชอบคำถามเหมาะสำหรับใยแมงมุมและทำให้ฉันรัก rsync อีกครั้ง ไชโย!


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