วิธีแทนที่ไฟล์ที่ซ้ำกันทั้งหมดด้วยฮาร์ดลิงก์?


20

ฉันมีสองโฟลเดอร์ที่มีไฟล์ต่าง ๆ ไฟล์บางไฟล์จากโฟลเดอร์แรกมีสำเนาถูกต้องในโฟลเดอร์ที่สอง ฉันต้องการแทนที่สิ่งเหล่านั้นด้วยฮาร์ดลิงก์ ฉันจะทำสิ่งนั้นได้อย่างไร


2
โปรดระบุระบบปฏิบัติการและระบบไฟล์
Steven

ดีฉันใช้ ext4 บน Ubuntu 15.04 แต่ถ้ามีคนให้คำตอบสำหรับระบบปฏิบัติการอื่นฉันแน่ใจว่ามันจะมีประโยชน์สำหรับคนที่อ่านคำถามนี้
qdii

คำตอบ:


20

ฉันรู้โซลูชั่น 4 บรรทัดคำสั่งสำหรับ linux ตัวเลือกที่ฉันต้องการคือตัวสุดท้ายที่แสดงที่นี่rdfindเนื่องจากมีตัวเลือกทั้งหมดที่ใช้ได้

fdupes

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

เอาต์พุตตัวอย่าง (พร้อมตัวเลือก "ขนาดแสดง", "เรียกซ้ำ"):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile

Hardlink

  • ออกแบบมาเพื่อให้เป็นชื่อบ่งชี้แทนที่ไฟล์ที่พบด้วยการเชื่อมโยง
  • มี--dry-runตัวเลือก
  • ไม่ได้ระบุว่าเนื้อหาถูกเปรียบเทียบอย่างไร แต่ต่างจากตัวเลือกอื่น ๆ ทั้งหมดโดยคำนึงถึงโหมดไฟล์บัญชีเจ้าของและเวลาที่แก้ไข

เอาต์พุตตัวอย่าง (โปรดสังเกตว่าไฟล์สองไฟล์ของฉันมีเวลาแก้ไขแตกต่างกันเล็กน้อยอย่างไรดังนั้นในการรันครั้งที่สองฉันบอกให้ไม่สนใจ)

$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500

$ hardlink --dry-run -v .
Mode:     dry-run
Files:    5
Linked:   0 files
Compared: 0 files
Saved:    0 bytes
Duration: 0.00 seconds

$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode:     dry-run
Files:    5
Linked:   1 files
Compared: 1 files
Saved:    17 bytes
Duration: 0.00 seconds

ดัฟฟ์

  • สร้างขึ้นเพื่อค้นหาไฟล์ที่ผู้ใช้ดำเนินการ ไม่มีการดำเนินการ
  • การเปรียบเทียบจะทำตามขนาดไฟล์จากนั้นแฮช sha1
    • แฮชสามารถเปลี่ยนเป็น sha256, sha384 หรือ sha512
    • แฮชสามารถปิดใช้งานเพื่อทำการเปรียบเทียบแบบเป็นไบต์ต่อไบต์

เอาต์พุตตัวอย่าง (พร้อมตัวเลือก "เรียกซ้ำ"):

$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File

rdfind

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

ตัวอย่างผลลัพธ์:

$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.

$ cat results.txt 
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# end of file

1
"จากนั้น md5 (ค่าเริ่มต้น) หรือ sha1" ไม่ได้หมายความว่าไฟล์เหมือนกัน เนื่องจากการคำนวณแฮชต้องการให้โปรแกรมอ่านไฟล์ทั้งหมดต่อไปจึงควรเปรียบเทียบไฟล์ทั้งหมดกับไบต์ต่อไบต์ ประหยัดเวลาของ CPU เช่นกัน
endolith

@endolith นั่นคือเหตุผลที่คุณมักจะเริ่มต้นด้วยการทำงานแบบแห้งเพื่อดูว่าจะเกิดอะไรขึ้น ...
Izkata

แต่จุดของซอฟต์แวร์คือการระบุไฟล์ที่ซ้ำกันให้คุณ หากคุณต้องตรวจสอบด้วยตนเองอีกครั้งว่าไฟล์ซ้ำซ้อนจริง ๆ แล้วก็ไม่ดี
endolith


2
ถ้าคุณมีnไฟล์ที่มีขนาดเหมือนไบต์แรกและปลายไบต์ แต่พวกเขากำลังทั้งหมดที่แตกต่างกันฉะนั้นการกำหนดว่าด้วยการเปรียบเทียบโดยตรงต้องn ! เปรียบเทียบคู่ การแฮชทั้งหมดแล้วเปรียบเทียบแฮชจะเร็วกว่ามากโดยเฉพาะไฟล์ขนาดใหญ่และ / หรือไฟล์จำนวนมาก สิ่งใดก็ตามที่ผ่านตัวกรองนั้นสามารถทำการเปรียบเทียบโดยตรงเพื่อยืนยัน (หรือใช้แฮชที่ดีกว่าเพื่อเริ่มต้น)
Alan De Smet

6

ผู้บัญชาการซ้ำเป็นทางออกที่เป็นไปได้ใน Windows:

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

คุณสมบัติ:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...

1

สำหรับ Linux คุณสามารถหาสคริปต์ทุบตีที่นี่


2

Duplicate & Same File Searcherเป็นอีกวิธีการหนึ่งใน Windows

Duplicate & Same Files Searcher (Duplicate Searcher) เป็นแอปพลิเคชั่นสำหรับค้นหาไฟล์ที่ซ้ำกัน (โคลน) และฮาร์ดไดรฟ์ NTFS ไปยังไฟล์เดียวกัน มันค้นหาเนื้อหาไฟล์ที่ซ้ำกันโดยไม่คำนึงถึงชื่อไฟล์ (ใช้การเปรียบเทียบแบบไบต์ต่อไบต์จริง) แอปพลิเคชั่นนี้ไม่เพียง แต่อนุญาตให้ลบไฟล์ที่ซ้ำกันหรือย้ายไปยังตำแหน่งอื่น แต่เพื่อแทนที่ไฟล์ที่ซ้ำกันด้วยฮาร์ดไดรฟ์ NTFS เช่นกัน (ไม่ซ้ำกัน!)

ป้อนคำอธิบายรูปภาพที่นี่


1

ฉันมีเครื่องมือฟรีที่ดีในคอมพิวเตอร์ของฉันชื่อ Link Shell Extension; ไม่เพียงเป็นการดีสำหรับการสร้างฮาร์ดลิงก์และลิงค์สัญลักษณ์ แต่รวมถึง Junctions ด้วย! นอกจากนี้ยังเพิ่มไอคอนแบบกำหนดเองที่ช่วยให้คุณระบุลิงค์ประเภทต่างๆได้อย่างง่ายดายแม้กระทั่งลิงค์ที่มีอยู่ก่อนการติดตั้ง ลูกศรสีแดงแสดงถึงฮาร์ดลิงก์ตัวอย่างเช่นสีเขียวแสดงถึงลิงค์สัญลักษณ์ ... และเชนส์เป็นตัวแทนของจังก์ชัน

ฉันโชคไม่ดีที่ถอนการติดตั้งซอฟต์แวร์กลับมาอีกครั้ง (ในการถอนการติดตั้งจำนวนมากของโปรแกรมต่าง ๆ ) ดังนั้นฉันจึงไม่สามารถสร้างลิงก์ด้วยตนเองได้อีกต่อไป แต่ไอคอนจะยังปรากฏขึ้นโดยอัตโนมัติเมื่อ Windows ตรวจพบลิงก์ Hard, Symbolic หรือ Junction


1

ผมขอแนะนำให้jdupes มันเป็นทางแยกที่เพิ่มขึ้นของfdupesแต่ยังรวมถึง:

  • พวงของตัวเลือกบรรทัดคำสั่งใหม่ - รวมถึง--linkhardหรือ-Lสั้น ๆ
  • สนับสนุนพื้นเมืองสำหรับแพลตฟอร์มระบบปฏิบัติการที่สำคัญทั้งหมด
  • ความเร็วบอกว่าจะเร็วกว่า fdupes โดยเฉลี่ย 7 เท่า

สำหรับคำถามของคุณคุณสามารถดำเนินการ$ jdupes -L /path/to/your/filesได้

คุณอาจต้องการโคลนและสร้างแหล่งข้อมูลล่าสุดจากrepoของGitHubเนื่องจากโครงการยังอยู่ระหว่างการพัฒนา Windows ไบนารียังมีให้ที่นี่ ไบนารีแพคเกจที่มีอยู่ในบางลินุกซ์ distros / BSD - $ apt searchจริงครั้งแรกที่ผมพบว่ามันผ่าน

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