การย้ายไฟล์จำนวนมาก (~ 100,000 ครั้ง)


13

ฉันทำงานกับโฟลเดอร์ที่มีไฟล์จำนวนมากเช่น 100 000 หรือ 1,000 000 ไฟล์ต่อโฟลเดอร์ เมื่อฉันพยายามย้ายเนื้อหาของโฟลเดอร์ไปยังที่อื่นคอมพิวเตอร์ของฉันจะติดขัดอยู่เสมอ แม้เมื่อกระบวนการดูเหมือนจะเสร็จสิ้นฉันไม่สามารถดูเนื้อหาของโฟลเดอร์ใด ๆ ได้เพราะดูเหมือนว่าหอยโข่งนั้นแข็งและฉันต้องบังคับให้คอมพิวเตอร์รีสตาร์ท ฉันสังเกตเห็นว่าสิ่งนี้เกิดขึ้นเมื่อฉันพยายามย้ายไฟล์เช่น 10,000 ไฟล์

คอมพิวเตอร์ของฉันเป็นปัญหาหรือเป็นเรื่องปกติเมื่อทำงานกับตัวเลขเหล่านี้หรือไม่

มีวิธีใดในการทำการถ่ายโอนไฟล์นี้อย่างชาญฉลาด?


3
สิ่งที่เกี่ยวกับการใช้ terminal ( cp -R SRC/ DEST/)
UniversallyUniqueID

2
@BharadwajRaju: ขึ้นอยู่กับไฟล์ cp -a อาจจะดีกว่าเพราะมันจะรักษาเจ้าของการประทับเวลาและการอนุญาต ฉันขอแนะนำ rsync เพราะสามารถยืนยันการถ่ายโอนและคัดลอกเฉพาะไฟล์ที่ไม่มีอยู่แล้วเท่านั้น
Michael

ปรับปรุง: gvfs-copy(จากgvfs-binแพคเกจ) cpได้เร็วกว่า
UniversallyUniqueID

คุณมีสองคำถามที่นี่แทนที่จะเป็นหนึ่งคำถาม โปรดตรวจสอบคำแนะนำในหน้าวิธีสอบถาม
Luís de Sousa

คำตอบ:


19

อาจลองใช้วิธีบรรทัดคำสั่งล้วนๆเพื่อถ่ายโอนไฟล์จำนวนมาก ๆ อย่างไม่ต้องสงสัยคุณจะพบกระบวนการนี้ อย่างมากเร็วกว่าการใช้แบบ GUI

มีหลายวิธีที่จะทำให้สิ่งนี้สำเร็จ แต่สิ่งต่อไปนี้ทำงานได้อย่างรวดเร็วปลอดภัยและมีประสิทธิภาพในระบบของฉัน:

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

คำอธิบายบางอย่างสำหรับคำสั่งนี้:

  1. ไดเรกทอรีอินพุตของคุณคือ '.' ตัวอักษรและสำหรับคำสั่งนี้คุณจะต้องอยู่ในไดเรกทอรีนั้น
  2. ไดเรกทอรีผลลัพธ์ของคุณคือ<destination>ในตัวอย่างของฉัน เห็นได้ชัดว่าการปรับเปลี่ยนนี้เพื่อให้เหมาะกับความต้องการของคุณและออกจากวงเล็บ
  3. ไวยากรณ์นี้อนุญาตให้ใช้ชื่อไฟล์ที่มีช่องว่างเป็นโบนัส :)

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

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

การใช้xargsความเป็นไปได้เปิดมากมายโดยเฉพาะกับการเคลื่อนไหวของไฟล์จำนวนมาก มีความเป็นไปได้มากมาย

ปัญหาที่อาจเกิดขึ้น:

มีข้อผิดพลาดที่อาจเกิดขึ้นอย่างน้อย 2 ข้อที่ต้องไตร่ตรองขอบคุณผู้แสดงความคิดเห็นด้านล่างสำหรับความคิดเหล่านี้

  1. ไดเรกทอรีปลายทางของคุณอาจเสียหายในตำแหน่งที่ไม่สามารถเข้าถึงได้ในภายหลังพิมพ์ผิด ฯลฯmvจะยังคงย้ายไฟล์ที่นั่น! ระวังที่นี่ ...
  2. หาก-tตัวเลือก ( --target-directory) หายไปและโฟลเดอร์ปลายทางเป็นไฟล์จริงคุณจะย้ายไฟล์หนึ่งไฟล์และล้มเหลวในส่วนที่เหลือ mvมี 2 ความหมาย: การเปลี่ยนชื่อแหล่งที่ปลายทางหรือย้ายแหล่งไดเรกทอรี ระวังอีกครั้ง ...

2
จะไม่find . -maxdepth 1 -type f -exec mv -t test {} +ทำ?
muru

@muru: ขอบคุณสำหรับสิ่งที่ฉันได้ตัดแต่งเป็น-name...ชิ้นส่วนภายนอกแต่ฉันได้xargsเข้าที่
andrew.46

2
ฉันไม่รู้ว่า ... ในขณะที่คำสั่งนั้นถูกต้องตามที่เห็นได้ชัดฉันจะพิจารณาการย้ายที่สมบูรณ์โดยมีข้อผิดพลาดเล็กน้อย (เช่นถ้าคุณลืมที่จะรวมการ-tตั้งค่าสถานะฉันคิดว่าไฟล์ทั้งหมดจะถูก "ย้าย" ไปยังไฟล์เดียวที่เรียกว่าtestทำให้สูญเสียไฟล์ทั้งหมดของคุณยกเว้นหนึ่ง) ฉันคิดว่าฉันจะชอบrsyncตามด้วย ถ้าทั้งหมดถูกต้องแล้ว a rm. อย่างไรก็ตามฉันสามารถจินตนาการถึงสถานการณ์ที่เช็คดังกล่าวไม่สามารถทำงานอัตโนมัติ
Jos

@Jos: ขอบคุณฉันได้เพิ่มบันทึกท้ายกระดาษที่อธิบายความเป็นไปได้นี้ ยินดีที่จะเห็นrsync ตัวอย่างที่เขียนขึ้นเป็นคำตอบ?
andrew.46

Linux สนับสนุนรายการอาร์กิวเมนต์ที่ยาวมากดังนั้นคุณอาจทำได้mv dir1/* dir2และใช้วิธีเดียวfind -execหากมีปัญหาหรือถ้าคุณต้องการหลีกเลี่ยงการจับคู่โฟลเดอร์กับ glob ของคุณ (แม้ว่าจะขึ้นอยู่กับการตั้งชื่อของคุณมัก*.*จะตรงกับไฟล์ส่วนใหญ่ แต่ไม่ไดเรกทอรีมากที่สุดเพราะมันเป็นเรื่องธรรมดาที่จะมี.extensionในไฟล์และร่วมกันไม่ได้ที่จะมี.ในชื่อ directory)
ปีเตอร์ Cordes

4

ฉันเคยมีประสบการณ์คล้ายกันมาก่อนมันเป็นเรื่องปกติเมื่อต้องจัดการกับไฟล์จำนวนมาก ฉันมีชุดข้อมูล PDF จำนวนมาก (ชิ้นส่วนอิเล็กทรอนิกส์)

เครื่องมือ GUI ตรวจสอบรายละเอียดไฟล์ & ข้อมูลเมตา (ไอคอน / ภาพย่อขนาด, ... ) มันจะเป็นเรื่องใหญ่ในกรณีดังกล่าว แม้ในมุมมองไอคอนและไม่มีภาพขนาดย่อพวกเขาจะหยุดเนื่องจากส่วนใหญ่ไม่ได้ออกแบบมาสำหรับกรณีที่รุนแรง เครื่องมือ GUI พยายามโหลดไอคอนงานนำเสนอสำหรับไฟล์ / โฟลเดอร์ทั้งหมดในไดเรกทอรีแม้รายการเหล่านั้นจะไม่ปรากฏแก่ผู้ใช้ในส่วนของหน้าจอปัจจุบัน การเรียงลำดับเป็นส่วนหนึ่งของปัญหาและไม่มีวิธีหลีกเลี่ยง

  • ฉันจะแยกไฟล์ในโฟลเดอร์แยกตามยี่ห้อ / รุ่นน้อยกว่า 10,000 แต่ละไฟล์ คุณอาจจะสามารถใช้วัน (ในขณะที่คนส่วนใหญ่ทำด้วยภาพถ่าย / สแกน) หรือตัวอักษรตัวแรก (s) (ในขณะที่อูบุนตูที่เก็บแพคเกจ )
  • มันง่ายกว่าที่จะใช้เครื่องมือ CLI แทนเพราะจะแสดงเฉพาะสิ่งที่คุณร้องขอ คุณสามารถใช้สำหรับการค้นหาอย่างรวดเร็วในสถานที่ของlocatefind
  • สำหรับการดำเนินการย้ายใช้mvในเทอร์มินัล (เครื่องมือ GUI ช้าเพราะพยายามอัปเดตมุมมองเป็นระยะ)

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

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

  • สร้างแพ็คเกจเดียวหรือแพ็คเกจน้อยเช่น zip ที่ไม่มีการบีบอัดต่ำ / ต่ำ เมื่อคุณคัดลอกมันจะเร็วขึ้นดังนั้นให้DMAทำงานได้

3

หากคุณกำลังมองหาวิธีแก้ปัญหาที่ให้ประโยชน์ของการปฏิบัติการบรรทัดคำสั่งด้วยความรู้สึกและความยืดหยุ่นของ GUI ที่รวมกันฉันแนะนำmc( ผู้บัญชาการเที่ยงคืน )

mc commander มุมมอง 2 บานหน้าต่าง

มันเป็นตัวจัดการไฟล์ภาพตาม ncurses - คุณมีมุมมองสองบานหน้าต่างบนไฟล์และเมนูของคุณ การใช้เมาส์เป็นไปได้แม้ผ่าน ssh คุณสามารถเรียกดูรอบ ๆ fs ตรวจสอบไฟล์ด้วยวิวเวอร์ไฟล์กรองตามเกณฑ์แบบทันทีและทำการคัดลอกหรือย้ายการดำเนินการบนบรรทัดคำสั่ง

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


0

ฉันพบปัญหาที่ค่อนข้างคล้ายกัน - ฉันกำลังทดสอบการตั้งค่า RAID ของฉันและเมื่อทำการถ่ายโอนจำนวนมาก (เช่น 100,000+ ไฟล์และ 1-2 TB ของข้อมูลในครั้งเดียว) ดูเหมือนว่าการถ่ายโอนเริ่มเร็วพอสมควร - พูดได้ว่า ~ 200MB / วินาที จากนั้นช้าลงอย่างรวดเร็วไปยังที่ราบสูงที่เหมาะสม ~ 90-120MB / วินาที (อาจเป็นไปได้หลังจากการใช้ที่เก็บข้อมูลแฟลชแคชบนไดรฟ์) จากนั้นหลังจาก 20-30 นาทีการดำเนินการจะค่อยๆเริ่มลดลงถึงที่ราบสูงที่ต่ำกว่ามาก ~ 30-40MB / วินาทีแย่ลงเมื่อจัดการกับไฟล์ขนาดเล็ก - ใช้เวลา 4-5 ชั่วโมงในการเข้าใกล้ 15 ชั่วโมง

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

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

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