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


136

ฉันกำลังมองหาวิธีง่ายๆ (คำสั่งหรือชุดคำสั่งอาจเกี่ยวข้องกับfind) เพื่อค้นหาไฟล์ที่ซ้ำกันในสองไดเรกทอรีและแทนที่ไฟล์ในหนึ่งไดเรกทอรีด้วย hardlinks ของไฟล์ในไดเรกทอรีอื่น

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


20
ปัญหาหนึ่งที่คุณอาจพบเมื่อใช้ฮาร์ดลิงก์คือถ้ามีคนตัดสินใจที่จะทำบางสิ่งกับไฟล์เพลงของพวกเขาซึ่งคุณได้เชื่อมโยงไว้อย่างหนักพวกเขาอาจส่งผลกระทบต่อการเข้าถึงเพลงของคนอื่นโดยไม่ตั้งใจ
Steven D

4
ปัญหาอีกอย่างก็คือไฟล์สองไฟล์ที่มี "บางเพลงที่ยอดเยี่ยมจริง ๆ " แม้ว่าจะนำมาจากแหล่งเดียวกันด้วยตัวเข้ารหัสเดียวกันก็มีแนวโน้มที่จะไม่เหมือนกันแบบบิตต่อบิต
msw

3
ลำพังอาจจะดีกว่าที่จะมีโฟลเดอร์เพลงสาธารณะ ...
สเตฟาน


1
@tante: การใช้ symlink ช่วยแก้ปัญหาไม่ได้ เมื่อผู้ใช้ "ลบ" ไฟล์จำนวนลิงก์ที่ลิงก์จะลดลงเมื่อจำนวนถึงศูนย์ไฟล์จะถูกลบจริงๆนั่นคือทั้งหมด ดังนั้นการลบจึงไม่มีปัญหากับไฟล์ฮาร์ดลิงก์ปัญหาเดียวคือผู้ใช้ที่พยายามแก้ไขไฟล์ (ไม่สามารถพิสูจน์ได้จริง ๆ ) หรือเขียนทับมัน (เป็นไปได้มากหากเข้าสู่ระบบ)
maaartinus

คำตอบ:


41

มีสคริปต์ Perl ที่http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.plซึ่งทำสิ่งที่คุณต้องการ:

สำรวจไดเรกทอรีทั้งหมดที่ตั้งชื่อบนบรรทัดคำสั่งคำนวณ MD5 checksums และค้นหาไฟล์ที่มี MD5 เหมือนกัน หากมีค่าเท่ากันให้ทำการเปรียบเทียบจริงถ้ามันเท่ากันจริง ๆ ให้แทนที่ไฟล์ที่สองของสองไฟล์ด้วยฮาร์ดลิงก์ไปยังไฟล์แรก


ฟังดูสมบูรณ์แบบขอบคุณ !! ฉันจะลองและยอมรับว่ามันใช้งานได้ตามที่อธิบายไว้!
Josh

3
นี่เป็นสิ่งที่ฉันขอ อย่างไรก็ตามฉันเชื่อว่าในที่สุด ZFS ที่มีการลดความซ้ำซ้อนจะเป็นวิธีการที่ทำได้เนื่องจากฉันพบว่าไฟล์นั้นมีความแตกต่างกันเล็กน้อย
Josh

11
โหวตให้สิ่งนี้ แต่หลังจากการค้นคว้าเพิ่มเติมฉันก็ไม่ได้ rdfindสามารถใช้ได้ผ่านผู้จัดการแพคเกจสำหรับแพลตฟอร์มที่สำคัญทั้งหมด (os x, linux, (cyg) win, solaris) และทำงานด้วยความเร็วดั้งเดิม ลองดูคำตอบด้านล่าง
oligofren

@oligofren ฉันคิดเหมือนกัน [Errno 31] Too many linksแต่แล้วฉันตี เศษเหล็กนี้ดูเหมือนจะเป็นสิ่งเดียวที่จัดการได้
phunehehe

5
ตรวจสอบว่าทุกไฟล์เดียวมากกว่าไฟล์ที่มีอยู่อย่างน้อยหนึ่งไฟล์ที่มีขนาดเท่ากันไม่มีประสิทธิภาพโดยไม่จำเป็น
Charles Duffy

85

rdfindทำสิ่งที่คุณขออย่างแน่นอน (และในลำดับjohny ทำไมรายการ) ทำให้เป็นไปได้ที่จะลบรายการที่ซ้ำกันแทนที่ด้วยลิงก์อ่อนหรือฮาร์ดลิงก์ เมื่อรวมกับsymlinksคุณยังสามารถสร้าง symlink ได้ทั้งแบบสัมบูรณ์หรือแบบสัมพัทธ์ คุณสามารถเลือกอัลกอริทึม checksum (md5 หรือ sha1)

เนื่องจากมีการรวบรวมมันจะเร็วกว่าโซลูชันที่ใช้สคริปต์มากที่สุด: timeในโฟลเดอร์ 15 GiB ที่มี 2600 ไฟล์บน Mac Mini ของฉันตั้งแต่ปี 2009 ส่งคืนสิ่งนี้

9.99s user 3.61s system 66% cpu 20.543 total

(ใช้ md5)

มีให้ในเครื่องจัดการแพ็คเกจส่วนใหญ่ (เช่น MacPorts สำหรับ Mac OS X)


11
+1 ฉันใช้rdfindและรักมัน มันมี-dryrun trueตัวเลือกที่จะให้คุณรู้ว่ามันจะทำอะไร -makehardlinks trueเปลี่ยนรายการที่ซ้ำกันมีการเชื่อมโยงอย่างหนักเป็นง่ายๆเป็น มันสร้างบันทึกที่ดีและแจ้งให้ฉันทราบว่ามีพื้นที่ว่างเท่าใด นอกจากนี้ตามมาตรฐานของผู้เขียนrdfind นั้นเร็วกว่าดัฟฟ์และ fslint
Daniel Trebbien

ดีมาก ฉันเคยใช้ fdupes แต่ตัวเลือก -L สำหรับการเชื่อมโยงฮาร์ลิงค์ขาดหายไปใน Ubuntu 14.10 ล่าสุด ค่อนข้างช้าและไม่มีอยู่สำหรับ Homebrew บน OSX ดังนั้นคำตอบนี้ดีกว่า ขอบคุณ!
oligofren

อัลกอริทึมที่ชาญฉลาดและรวดเร็ว
ndemou

2
ฉันสงสัยว่าประสิทธิภาพของเครื่องมือนี้เกี่ยวข้องกับอัลกอริธึมเองมากกว่าและน้อยกว่าไม่ว่าจะเป็นเครื่องมือที่รวบรวมหรือสคริปต์ สำหรับการดำเนินการเช่นนี้ดิสก์จะเป็นคอขวดเกือบตลอดเวลา ตราบใดที่เครื่องมือสคริปต์ตรวจสอบให้แน่ใจว่าพวกเขามีการดำเนินการ async I / O ที่กำลังดำเนินการในขณะที่เผาซีพียูบน checksums พวกเขาควรดำเนินการเช่นเดียวกับไบนารีพื้นเมือง
cdhowie

rdfind ขึ้นอยู่กับระบบปฏิบัติการและคอมไพเลอร์ใหม่มาก (จะไม่ทำงานบน CentOS 6.x หากไม่มีการสร้างเครื่องมือการพัฒนาใหม่อย่างสมบูรณ์)
Cosmo F

49

ใช้fdupesเครื่องมือ:

fdupes -r /path/to/folderแสดงรายการที่ซ้ำกันในไดเรกทอรี (-r ทำให้เป็นแบบเรียกซ้ำ) ผลลัพธ์มีลักษณะดังนี้:


filename1
filename2

filename3
filename4
filename5


ด้วยชื่อไฟล์ 1 และชื่อไฟล์ 2 เหมือนกันและชื่อไฟล์ 3, ชื่อไฟล์ 4 และชื่อไฟล์ 5 ก็เหมือนกัน


1
Ubuntu หมายเหตุ: จนถึงเดือนกันยายน 2556 ยังไม่มีการเปิดตัวที่เสถียร (อยู่ที่ 1.50-PR2-3) ดังนั้นการอัปเดตจะไม่ปรากฏใน Ubuntu
Stuart Axon

11
ฉันเพิ่งลองติดตั้ง fdupes_1.50-PR2-4 ทั้งบน Ubuntu และ Debian และไม่มีแฟล็ก -L โชคดีที่การสร้างจากgithub.com/tobiasschulz/fdupesนั้นง่ายมาก
neu242

3
ลองrdfindเหมือนfdupesแต่เร็วกว่าและใช้งานได้ใน OS X และ Cygwin เช่นกัน
oligofren

6
fdupesดูเหมือนว่าจะค้นหารายการที่ซ้ำกันเท่านั้นไม่แทนที่ด้วย hardlinks ดังนั้นจึงไม่ใช่คำตอบสำหรับคำถาม IMO
Calimo

2
มีเครื่องมือที่คล้ายกันที่เรียกjdupesว่าอิงตามfdupesแต่ยังสามารถแทนที่ไฟล์ที่ซ้ำกันด้วย symlinks ( -l), hardlinks ( -L) หรือสั่ง btrfs เพื่อทำซ้ำบล็อกในระดับระบบไฟล์ ( -Bถ้าคุณใช้ btrfs)
Marius Gedminas

23

ฉันใช้hardlinkจากhttp://jak-linux.org/projects/hardlink/


1
คำแนะนำที่ดีผมใช้อยู่บนฐานปกติcode.google.com/p/hardlinkpyแต่ตอนนี้ยังไม่ได้รับการปรับปรุงในขณะที่ ...
meduz

2
สิ่งนี้ดูเหมือนจะคล้ายกับต้นฉบับhardlinkบน Fedora / RHEL / etc

1
hardlinkตอนนี้เป็นไบนารีพื้นฐานในหลาย ๆ แพ็คเกจระบบ Linux (ตั้งแต่ ~ 2014) และเร็วที่สุด สำหรับไฟล์ 1,2M (320GB) ใช้เวลาเพียง 200 วินาที (เชื่อมโยงประมาณ 10% ของไฟล์)
Marcel Waldvogel

FWIW ข้างต้นhardlinkถูกสร้างโดย Julian Andres Klode ในขณะที่ Fedora hardlinkถูกสร้างขึ้นโดย Jakub Jelinek (ที่มา: pagure.io/hardlink - ชื่อแพ็คเกจ Fedora: hardlink)
maxschlepzig

18

นี่เป็นหนึ่งในฟังก์ชั่นที่จัดทำโดย "fslint" - http://en.flossmanuals.net/FSlint/Introduction

คลิกปุ่ม "ผสาน":

ภาพหน้าจอ


4
-m จะ hardlink ซ้ำกันกัน -d จะลบทั้งหมด แต่หนึ่งและ t-จะแห้งวิ่งพิมพ์สิ่งที่มันจะทำ
Azendale

1
บน Ubuntu นี่คือสิ่งที่ต้องทำ: sudo apt-get install fslint /usr/share/fslint/fslint/findup -m /your/directory/tree(/ usr / share / FSlint / FSlint / ไม่ได้อยู่ใน $ PATH ค่าเริ่มต้น)
โจเซลีน

14

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

ZFS มีการลบข้อมูลซ้ำ (ระดับบล็อกไม่ใช่ระดับไฟล์) ตั้งแต่พูลเวอร์ชัน 23 และการบีบอัดมานานแล้ว หากคุณใช้ linux คุณอาจลองใช้zfs-fuseหรือถ้าคุณใช้ BSD มันก็รองรับอย่างเป็นทางการ


นี่อาจเป็นวิธีที่ฉันจะไปในที่สุดอย่างไรก็ตามการนำ ZFS ของ BSD ไปทำซ้ำซ้อนหรือไม่ ฉันคิดว่ามันไม่ได้
Josh

นอกจากนี้ระบบไฟล์ HAMMER บน DragonFlyBSD ยังรองรับการขจัดข้อมูลซ้ำซ้อน
hhaamu

14
ZFS dedup เป็นเพื่อนของใคร ที่ ZFS แนะนำให้ใช้ 1Gb ram ต่อพื้นที่ดิสก์ที่ใช้งานได้ 1Tb คุณจะต้องใช้ถั่วถ้าคุณพยายามใช้ dedup ด้วย ram น้อยกว่า 32Gb ต่อ 1Tb พื้นที่ดิสก์ที่ใช้งานได้ นั่นหมายความว่าสำหรับกระจก 1Tb หากคุณไม่มี ram 32 Gb คุณจะพบกับเงื่อนไขการทิ้งหน่วยความจำไม่ช้าก็เร็วที่จะหยุดเครื่องเนื่องจากไม่มี ram เคยมาที่นั่นแล้วทำยังคงฟื้นตัวจากพล็อต
killermist

4
เพื่อหลีกเลี่ยงความต้องการ RAM ที่มากเกินไปด้วยการขจัดข้อมูลซ้ำซ้อนออนไลน์ (เช่นตรวจสอบการเขียนทุกครั้ง) btrfsใช้การแบตช์ซ้ำซ้อนหรือออฟไลน์ (รันทุกครั้งที่คุณพิจารณาว่ามีประโยชน์ / จำเป็น) btrfs.wiki.kernel.org/index.php/Deduplication
Marcel Waldvogel

3
อัปเดตเจ็ดปีต่อมา: ในที่สุดฉันก็ย้ายไปที่ ZFS และลองลดความซ้ำซ้อน - ฉันพบว่าข้อกำหนดของ RAM นั้นสูงมาก การใช้สแนปชอตของ ZFS อย่างมีเล่ห์เหลี่ยมนั้นเป็นวิธีแก้ปัญหาที่ฉันใช้ (คัดลอกหนึ่งเพลงภาพรวมของผู้ใช้และโคลนคัดลอกเพลงของผู้ใช้ที่สองเข้าไปในโคลนโดยใช้rsync --inplaceเพียงการเปลี่ยนแปลงบล็อกจะถูกเก็บไว้)
จอช

7

ในลินุกซ์ยุคใหม่ทุกวันนี้มีhttps://github.com/g2p/bedupซึ่งซ้ำซ้อนกับระบบไฟล์ btrfs แต่ 1) โดยไม่มีการสแกนมากเกินไป 2) ไฟล์สามารถแยกออกได้อย่างง่ายดายอีกครั้งในภายหลัง


1
ประวัติความเป็นมาและข้อมูลเพิ่มเติมมีอยู่ในbtrfs.wiki.kernel.org/index.php/Deduplication (รวมถึงการอ้างอิงcp --reflinkดูที่ด้านล่าง)
Marcel Waldvogel

5

หากต้องการค้นหาไฟล์ที่ซ้ำกันคุณสามารถใช้ดัฟฟ์

Duff เป็นยูทิลิตีบรรทัดคำสั่ง Unix เพื่อค้นหารายการที่ซ้ำกันอย่างรวดเร็วในชุดไฟล์ที่กำหนด

เพียงแค่เรียกใช้:

duff -r target-folder

ในการสร้างฮาร์ดลิงก์ไปยังไฟล์เหล่านั้นโดยอัตโนมัติคุณจะต้องวิเคราะห์เอาต์พุตของดัฟฟ์ด้วยbashหรือภาษาสคริปต์อื่น ๆ


แม้ว่าจะช้ามาก - ดูrdfind.pauldreik.se/#g0.6
ndemou

5
aptitude show hardlink

คำอธิบาย: ฮาร์ดลิงก์หลายชุดของไฟล์เดียวกันฮาร์ดลิงก์เป็นเครื่องมือที่ตรวจจับไฟล์เดียวกันหลายชุดและแทนที่ด้วยฮาร์ดลิงก์

แนวคิดนี้นำมาจากhttp://code.google.com/p/hardlinkpy/แต่รหัสนั้นเขียนขึ้นมาจากศูนย์และอนุญาตภายใต้ใบอนุญาต MIT หน้าแรก: http://jak-linux.org/projects/hardlink/


โปรแกรมเดียวที่กล่าวถึงที่นี่มีให้สำหรับ Gentoo โดยไม่ต้องเปิดโปงและสนับสนุน hardlink ขอบคุณ!
Jorrit Schippers

4

ฉันใช้เครื่องมือเชื่อมโยงหลายตัวสำหรับ Linux ที่กล่าวถึงที่นี่ ฉันก็ติดอยู่กับ ext4 fs บน Ubuntu และได้ใช้cp -lและ-sสำหรับฮาร์ด / ซอฟต์ลิงก์ แต่เมื่อเร็ว ๆ นี้สังเกตเห็นสำเนาที่มีน้ำหนักเบาในหน้า man cpซึ่งจะหมายถึงการสำรองพื้นที่ดิสก์ที่ซ้ำซ้อนจนกว่าฝ่ายใดฝ่ายหนึ่งจะได้รับการแก้ไข:

   --reflink[=WHEN]
          control clone/CoW copies. See below

       When  --reflink[=always]  is specified, perform a lightweight copy, where the 
data blocks are copied only when modified.  If this is not possible the
       copy fails, or if --reflink=auto is specified, fall back to a standard copy.

ฉันคิดว่าฉันจะอัปเดตcpนามแฝงของฉันเพื่อรวม--reflink=autoพารามิเตอร์เสมอ
Marcos

1
ext4 รองรับจริง ๆ--reflinkหรือไม่

7
สิ่งนี้ได้รับการสนับสนุนบน btrfs และ OCFS2 เป็นไปได้เฉพาะกับระบบไฟล์ที่คัดลอกเมื่อเขียนซึ่ง ext4 ไม่ใช่ btrfs กำลังก่อตัวขึ้นจริงๆ ฉันชอบที่จะใช้มันเพราะ reflink และ snapshots ทำให้คุณกลัวน้อยลงในการใช้งานไฟล์จำนวนมากบนต้นไม้ขนาดใหญ่
clacke

3

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

  • ชื่อไฟล์
  • ขนาด
  • md5 checksum
  • เนื้อหาไบต์

ทำวิธีการใด ๆ ทำเช่นนี้? ดูduff, fdupes, rmlint, fslintฯลฯ

วิธีการต่อไปนี้ได้รับการโหวตสูงสุดในcommandlinefu.com : ค้นหาไฟล์ที่ซ้ำกัน (ขึ้นอยู่กับขนาดก่อนจากนั้นแฮช MD5)

สามารถเพิ่มการเปรียบเทียบชื่อไฟล์เป็นขั้นตอนแรกขนาดเป็นขั้นตอนที่สองได้หรือไม่?

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | \
  xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | \
  sort | uniq -w32 --all-repeated=separate

3
ผมเคยใช้duff, fdupesและrmlintและขอแนะนำให้ผู้อ่านที่จะมองไปที่สามเหล่านี้ มันมีชุดตัวเลือกที่ยอดเยี่ยม (และเอกสาร) ด้วยฉันสามารถหลีกเลี่ยงการโพสต์การประมวลผลจำนวนมากที่ฉันต้องการใช้กับเครื่องมืออื่น ๆ
dubiousjim

3
ในชื่อไฟล์การปฏิบัติของฉันเป็นปัจจัยที่เชื่อถือได้น้อยที่สุดในการดูและฉันได้ลบมันออกอย่างสมบูรณ์จากความพยายามใด ๆ ที่ฉันทำ de-duping install.shสามารถพบไฟล์ได้กี่ไฟล์ในระบบที่ใช้งานอยู่? ฉันไม่สามารถนับจำนวนครั้งที่ฉันบันทึกไฟล์และมีการปะทะกันของชื่อด้วยการเปลี่ยนชื่อแบบทันทีเพื่อบันทึก ด้านพลิก: ไม่ทราบว่าฉันได้ดาวน์โหลดบางสิ่งบางอย่างจากแหล่งข้อมูลที่แตกต่างกันในวันที่ต่างกันเพียงเพื่อจะพบว่าพวกเขาเป็นไฟล์เดียวกันกับชื่อที่แตกต่าง (ซึ่งยังฆ่าความน่าเชื่อถือการประทับเวลาด้วย) 1: ขนาด 2: ข้อมูลย่อย 3: เนื้อหาไบต์
Spellweaver Gypsy

@GypsySpellweaver: (1) ขึ้นอยู่กับการใช้งานส่วนตัวคุณไม่เห็นด้วยไหม ในกรณีของฉันฉันมีหลายคืนจากการสำรองข้อมูลหลายไฟล์ที่มีชื่อและเนื้อหาเดียวกันอยู่ในโฟลเดอร์คืนค่าที่แตกต่างกัน (2) ความคิดเห็นของคุณดูเหมือนว่าจะสรุปการเปรียบเทียบชื่อไฟล์เท่านั้น ฉันไม่ได้แนะนำให้กำจัดเช็คอื่น ๆ
johny ทำไม

2

เนื่องจากฉันไม่ใช่แฟนของ Perl นี่เป็นเวอร์ชั่นทุบตี:

#!/bin/bash

DIR="/path/to/big/files"

find $DIR -type f -exec md5sum {} \; | sort > /tmp/sums-sorted.txt

OLDSUM=""
IFS=$'\n'
for i in `cat /tmp/sums-sorted.txt`; do
 NEWSUM=`echo "$i" | sed 's/ .*//'`
 NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
 if [ "$OLDSUM" == "$NEWSUM" ]; then
  echo ln -f "$OLDFILE" "$NEWFILE"
 else
  OLDSUM="$NEWSUM"
  OLDFILE="$NEWFILE"
 fi
done

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

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

หมายเหตุ: ดังที่ได้กล่าวไว้ก่อนหน้าฮาร์ดลิงก์จะทำงานตราบใดที่ไฟล์ไม่จำเป็นต้องมีการดัดแปลงหรือถูกย้ายข้ามระบบไฟล์


ฉันจะเปลี่ยนสคริปต์ของคุณได้อย่างไรเพื่อที่จะไม่ลบลิงก์ออกมันจะลบไฟล์ที่ซ้ำกันและจะเพิ่มรายการไฟล์ที่ถูกลบ -> ไฟล์ที่มีไฟล์ CSV ไปยังไฟล์ CSV . ???
MR.GEWA

แน่ใจ บรรทัดการเชื่อมโยงฮาร์ด: echo ln -f "$ OLDFILE" "$ NEWFILE" เพียงแค่แทนที่ไฟล์ที่ซ้ำกันด้วยการเชื่อมโยงอย่างหนักเพื่อให้คุณสามารถเปลี่ยนมันเป็น $ NEWFILE แทน
seren

และวิธีการในบรรทัดถัดไปเขียนในไฟล์ข้อความอย่างใด $ OLDFILE-> NEWFILE ???
MR.GEWA

อ่าใช่มั้ย ใช่เพิ่มบรรทัดหลัง rm เช่น: echo "$ NEWFILE" >> /var/log/deleted_duplicate_files.log
seren

2
อย่า friggin พลิกโฉมพวงมาลัย มีวิธีแก้ปัญหาที่เป็นผู้ใหญ่มากกว่าเช่นrdfindที่ทำงานที่ความเร็วดั้งเดิมและเพียงแค่ต้องการbrew install rdfindหรือapt-get install rdfindติดตั้ง
oligofren

1

ฉันสร้างสคริปต์ Perl ที่ทำสิ่งที่คล้ายกับสิ่งที่คุณพูดถึง:

http://pastebin.com/U7mFHZU7

โดยพื้นฐานแล้วมันเพียงแค่สำรวจไดเรกทอรีคำนวณ SHA1sum ของไฟล์ที่อยู่ในไฟล์ hashing และเชื่อมโยงเข้าด้วยกัน มีประโยชน์หลายครั้งหลายครั้ง


2
ฉันหวังว่าจะได้ลองทำสิ่งนี้ในไม่ช้า ... ทำไมไม่ลองอัปโหลดใน CPAN ... แอป :: เชื่อมโยงใหม่หรือบางอย่าง
xenoterracide

2
@xenoterracide: เนื่องจากโซลูชันที่คล้ายกันและเป็นผู้ใหญ่มากกว่าที่มีอยู่แล้วทั้งหมด ดูคำตอบอื่น ๆ โดยเฉพาะ rdfind
oligofren

1
@ oligofren ฉันไม่สงสัยเลยว่ามีวิธีแก้ปัญหาที่ดีกว่าอยู่แล้ว TMTOWTDI ฉันเดา
amphetamachine

1

หากคุณต้องการแทนที่รายการที่ซ้ำกันโดยฮาร์ดลิงก์บน mac หรือระบบที่ใช้ UNIX คุณสามารถลอง SmartDupe http://sourceforge.net/projects/smartdupe/ กำลังพัฒนามัน


3
คุณสามารถขยายความเป็น "อัจฉริยะ" ได้อย่างไร?
Stéphane Gimenez

1
ฉันจะเปรียบเทียบไฟล์ของสองไดเรกทอรีที่ต่างกันได้อย่างไร
Burcardo

1

applicatios FSLint ( http://www.pixelbeat.org/fslint/ ) สามารถค้นหาไฟล์ที่เท่าเทียมกันทั้งหมดในโฟลเดอร์ใด ๆ (ตามเนื้อหา) และสร้างฮาร์ดลิงก์ ให้มันลอง!

Jorge Sampaio


มันหยุดสแกน 1TB เกือบเต็ม ext3 ฮาร์ดดิสก์นำระบบทั้งหมดไปรวบรวมข้อมูล ยกเลิกหลังจาก "การค้นหา" 14 ชั่วโมง
Angsuman Chakraborty

1

jdupes ได้รับการกล่าวถึงในความคิดเห็น แต่สมควรได้รับคำตอบของตัวเองเนื่องจากมันอาจจะมีอยู่ในการกระจายส่วนใหญ่และทำงานได้อย่างรวดเร็ว (เพียงแค่ปล่อย 2.7 GB ของพาร์ติชัน 158 กิกะไบต์ 98% เต็ม (ไดรฟ์ SSD) 98% ในเวลาประมาณหนึ่งนาที):

jdupes -rL /foo/bar

0

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

วิธีที่ดีกว่าคือการลดความซ้ำซ้อนของชั้นระบบไฟล์ คุณสามารถใช้ BTRFS (ครั้งล่าสุดเป็นที่นิยมมาก), OCFS หรือเช่นนี้ ดูที่หน้า: https://en.wikipedia.org/wiki/Comparison_of_file_systems พิเศษที่ตารางคุณสมบัติและการคัดลอกข้อมูลคอลัมน์ คุณสามารถคลิกและจัดเรียง :)

ดูที่ระบบไฟล์ ZFS เป็นพิเศษ สิ่งนี้มีให้เป็น FUSE แต่ด้วยวิธีนี้มันช้ามาก หากคุณต้องการการสนับสนุนพื้นเมืองดูที่หน้าhttp://zfsonlinux.org/ จากนั้นคุณจะต้องแก้ไขเคอร์เนลและติดตั้งเครื่องมือ zfs สำหรับการจัดการต่อไป ฉันไม่เข้าใจทำไมลินุกซ์ไม่สนับสนุนในฐานะที่เป็นไดรเวอร์มันเป็นวิธีสำหรับระบบปฏิบัติการ / เมล็ดอื่น ๆ

ระบบไฟล์รองรับการขจัดข้อมูลซ้ำซ้อนได้ 2 วิธี, ไฟล์ซ้ำซ้อนหรือบล็อก ZFS รองรับการบล็อก ซึ่งหมายความว่าเนื้อหาเดียวกันที่ซ้ำกันในไฟล์เดียวกันสามารถทำซ้ำได้ วิธีอื่นคือเวลาที่ข้อมูลซ้ำซ้อนซึ่งสามารถออนไลน์ (zfs) หรือออฟไลน์ (btrfs)

ข้อสังเกตการขจัดข้อมูลซ้ำซ้อนจะใช้ RAM นี่คือสาเหตุที่การเขียนไฟล์ไปยังโวลุ่ม ZFS ที่ติดตั้งด้วย FUSE ทำให้ประสิทธิภาพการทำงานช้าลงอย่างมาก อธิบายไว้ในเอกสารประกอบ แต่คุณสามารถตั้งค่าเปิด / ปิดการลดความซ้ำซ้อนของข้อมูลออนไลน์ได้ หากคุณเห็นข้อมูลใด ๆ ที่ควรจะซ้ำซ้อนคุณเพียงแค่ตั้งค่าการขจัดความซ้ำซ้อนบนเขียนไฟล์ใหม่เป็นชั่วคราวและสุดท้ายแทนที่ หลังจากนี้คุณสามารถปิดการขจัดข้อมูลซ้ำซ้อนและเรียกคืนประสิทธิภาพการทำงานเต็มรูปแบบ แน่นอนคุณสามารถเพิ่มการจัดเก็บดิสก์แคชใด ๆ นี่อาจเป็นดิสก์หมุนเร็วหรือดิสก์ SSD แน่นอนว่านี่อาจเป็นดิสก์ขนาดเล็กมาก ในการทำงานจริงนี่คือการแทนที่สำหรับ RAM :)

ภายใต้ linux คุณควรดูแล ZFS เพราะไม่ใช่ทุกอย่างเท่าที่ควรจะเป็นพิเศษเมื่อคุณจัดการระบบไฟล์ทำ snapshot ฯลฯ แต่ถ้าคุณกำหนดค่าและไม่เปลี่ยนมันจะทำงานได้อย่างถูกต้อง วิธีอื่นคุณควรเปลี่ยน linux เป็น opensolaris รองรับ ZFS เป็นอย่างดี :) สิ่งที่ดีมากกับ ZFS คือมันทำงานได้ทั้งในระบบไฟล์และตัวจัดการ volumen คล้ายกับ LVM คุณไม่จำเป็นต้องใช้เมื่อคุณใช้ ZFS ดูเอกสารหากคุณต้องการทราบข้อมูลเพิ่มเติม

สังเกตเห็นความแตกต่างระหว่าง ZFS และ BTRFS ZFS มีอายุมากกว่าและโตกว่า แต่น่าเสียดายที่อยู่ภายใต้ Solaris และ OpenSolaris เท่านั้น BTRFS อายุน้อยกว่า แต่ครั้งสุดท้ายได้รับการสนับสนุนที่ดีมาก ฉันแนะนำเคอร์เนลใหม่ ZFS มีการขจัดข้อมูลซ้ำซ้อนแบบออนไลน์ซึ่งทำให้การเขียนช้าลงเนื่องจากทั้งหมดถูกคำนวณทางออนไลน์ BTRFS รองรับการขจัดความซ้ำซ้อนแบบออฟไลน์ จากนั้นสิ่งนี้จะบันทึกประสิทธิภาพการทำงาน แต่เมื่อโฮสต์ไม่มีสิ่งใดให้ทำคุณจะเรียกใช้เครื่องมือเป็นระยะเพื่อทำการขจัดข้อมูลซ้ำซ้อน และ BTRFS นั้นถูกสร้างขึ้นภายใต้ลินุกซ์ บางทีนี่อาจเป็น FS ที่ดีกว่าสำหรับคุณ :)


1
ฉันชอบวิธีการลดความซ้ำซ้อนแบบออฟไลน์ (หรือแบทช์ ) ที่btrfsมี การอภิปรายที่ยอดเยี่ยมของตัวเลือก (รวมถึงcp --reflinkตัวเลือก) ที่นี่: btrfs.wiki.kernel.org/index.php/Deduplication
Marcel Waldvogel

ZFS ไม่ใช่ Solaris หรือ OpenSolaris เท่านั้น มันได้รับการสนับสนุนใน FreeBSD นอกจากนี้ ZFS บน Linux ยังเป็นตัวควบคุมอุปกรณ์ ZFS บน FUSE เป็นสิ่งที่แตกต่าง
KJ Seefried

0

ลิงก์ถาวรอาจไม่ใช่แนวคิดที่ดีที่สุด หากผู้ใช้รายหนึ่งทำการเปลี่ยนแปลงไฟล์จะมีผลกับทั้งคู่ อย่างไรก็ตามการลบฮาร์ดลิงก์ไม่ได้เป็นการลบทั้งสองไฟล์ นอกจากนี้ฉันไม่แน่ใจว่าหากฮาร์ดลิงก์ใช้พื้นที่ในปริมาณเท่ากัน (บนฮาร์ดดิสก์ไม่ใช่ระบบปฏิบัติการ) เป็นไฟล์เดียวกันหลายสำเนา ตาม Windows (พร้อมกับ Link Shell Extension) พวกเขาทำ ได้รับนั่นคือ Windows ไม่ใช่ Unix ...

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


0

วิธีที่ง่ายที่สุดคือใช้โปรแกรมพิเศษ dupeGuru

ภาพหน้าจอการตั้งค่า dupeGuru

ตามที่เอกสารระบุไว้

ตัวเลือกการลบ

ตัวเลือกเหล่านี้มีผลต่อการลบที่ซ้ำกัน ส่วนใหญ่คุณไม่จำเป็นต้องเปิดใช้งานใด ๆ

ลิงก์ไฟล์ที่ถูกลบ:

ไฟล์ที่ถูกลบจะถูกแทนที่ด้วยลิงค์ไปยังไฟล์อ้างอิง คุณสามารถเลือกที่จะแทนที่ด้วย symlink หรือ hardlink ... symlink เป็นทางลัดไปยังเส้นทางของไฟล์ หากไฟล์ต้นฉบับถูกลบหรือย้ายลิงก์จะเสียหาย ฮาร์ดลิงก์คือลิงก์ไปยังไฟล์นั้น ลิงก์นั้นดีเท่ากับไฟล์ "ของจริง" เฉพาะเมื่อลบลิงก์ทั้งหมดไปยังไฟล์เท่านั้นไฟล์นั้นจะถูกลบทิ้ง

บน OSX และ Linux ฟีเจอร์นี้ได้รับการรองรับอย่างสมบูรณ์ แต่ภายใต้ Windows มันซับซ้อนเล็กน้อย Windows XP ไม่รองรับ แต่ Vista ขึ้นไปรองรับ อย่างไรก็ตามสำหรับคุณสมบัติในการทำงาน dupeGuru ต้องทำงานด้วยสิทธิ์ระดับผู้ดูแลระบบ

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