Çift dosyaları bul


90

Diskimde, bitleri birbiriyle aynı ancak farklı dosya adlarına sahip çift dosyaları bulmak mümkün müdür?


3
Bunu yapmanın olası herhangi bir yönteminin sisteminizdeki her bir dosyayı diğer tüm dosyalarla karşılaştırması gerekmeyeceğini unutmayın . Bu yüzden kısayollar alırken bile uzun zaman alacak .
Shadur

4
@Shadur eğer sağlama toplamları uygunsa, çoğu sistemde genellikle <64-byte girişli 10 ^ (5 + -1) sırasına sahip olan hashları karşılaştırmakla kaynaşır. Tabii ki, verileri en az bir kere okumak zorundasınız. :)
peterph

15
@Shadur Bu doğru değil. Eşleşmeleri kontrol ederek st_size, aynı olanlardan yalnızca birini ortadan kaldırarak ve ardından eşleşmeleri için yalnızca md5sums'leri hesaplayarak zamanı azaltabilirsiniz st_size.
Chris Down,

6
@Shadur, herhangi bir hash işlemine izin vermeyen inanılmaz derecede aptalca bir yaklaşım bile, bunu Θ (n log n) 'de karşılaştırabilir (Θ (n²) değil - çeşitli sıralama algoritmalarından herhangi birini kullanarak (dosya içeriğine dayanarak).
derobert

1
@ChrisDown Evet, boyut eşleştirme aklımdaki kısayollardan biri olurdu.
Shadur

Yanıtlar:


104

fdupesbunu yapabilirsin. Kimden man fdupes:

Verilen dosyayı yinelenen dosyalar için arar. Bu tür dosyalar, dosya boyutlarını ve MD5 imzalarını karşılaştırarak ve ardından bayt bayt karşılaştırmasıyla bulunur.

Debian veya Ubuntu ile birlikte kurabilirsiniz apt-get install fdupes. Fedora / Red Hat / CentOS’a yükleyebilirsiniz yum install fdupes. Arch Linux'ta pacman -S fdupesve Gentoo'da kullanabilirsiniz emerge fdupes.

Muhtemelen önemli miktarda zaman ve hafıza alacağınız dosya sistemi kökünüzden inen bir kontrol yapmak için, bunun gibi bir şey kullanın fdupes -r /.

Yorumlarda belirtildiği gibi, aşağıdakileri yaparak en büyük kopyaları alabilirsiniz:

fdupes -r . | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n

Bu, dosya adlarınız yeni satırlar içeriyorsa kırılır.


Teşekkürler. En büyük dupe'yu nasıl filtreleyebilirim? Boyutları insan tarafından okunabilir hale nasıl getirebilirim?
Öğrenci,

@student: dizisi boyunca bir şeyler kullanın (fdupes'in sadece fazla bilgi vermeden dosya adlarını çıktığından emin olun, ya da sadece bunu tutmak için kesip ya da bıktığından emin olun): fdupes ....... | xargs ls -alhd | egrep 'M |G 'dosyaları İnsan tarafından okunabilir biçimde ve sadece Megabayt veya Gigabayt cinsinden olanları tutmak için. Komutu gerçek çıktılara uyacak şekilde değiştirin.
Olivier Dulac

2
@OlivierDulac Asla ayrıştırmamalısın . Genelde kullanım durumunuzdan daha kötüdür, ancak kullanım durumunuzda bile yanlış pozitif riski vardır.
Chris Down

@student - Eğer dosya edindikten sonra, duyöneltilen sortsöyleyecektir.
Chris Down

@ChrisDown: Kötü bir alışkanlık olduğu doğru ve yanlış pozitifler verebilir. Ancak bu durumda (etkileşimli kullanım ve yalnızca görüntüleme için, "rm" ya da doğrudan ona dayanan herhangi bir türden hiçbir şey yoktur) bu iyi ve hızlı ^^. Bağlandığınız sayfaları seviyorum, btw (birkaç aydan beri okuyor ve birçok yararlı bilgi dolu)
Olivier Dulac

26

Başka bir iyi araç fslint:

fslint, çift dosyalar ve sorunlu dosya adları vb. dahil olmak üzere dosya sistemlerinde çeşitli sorunları bulmak için bir araçtır.

Bireysel komut satırı araçları GUI'ye ek olarak ve bunlara erişmek için standart bir kurulumda / usr / share / fslint / fslint dizinini değiştirebilir veya $ PATH seçeneğine ekleyebilirsiniz. Bu dizindeki bu komutların her biri, parametrelerini daha da ayrıntılandıran bir --help seçeneğine sahiptir.

   findup - find DUPlicate files

Debian tabanlı sistemlerde, onu kuracaksınız:

sudo apt-get install fslint

Üçüncü taraf araçlarını istemiyorsanız veya yükleyemiyorsanız, bunu el ile de yapabilirsiniz. Bu tür programların çoğunun çalışması, dosya sağlama toplamlarını hesaplamaktır . Aynı md5sum olan dosyalar neredeyse kesinlikle tamamen aynı verileri içerir. Yani, böyle bir şey yapabilirsin:

find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 

Örnek çıktı (bu örnekteki dosya adları aynıdır, ancak farklı olduklarında da çalışacaktır):

$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
 /usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---

Bu, daha önce bahsedilen özel araçlardan çok daha yavaş olacaktır , ancak işe yarayacaktır.


4
Kullanarak st_size, başka bir dosyayla aynı boyutta olan herhangi bir dosyayı bulmak, bu boyutta sadece bir dosyaya sahip olanları ortadan kaldırmak ve md5sums'leri yalnızca aynı dosyadaki dosyalar arasında hesaplamak çok daha hızlı olacaktır st_size.
Chris Down,

@ChrisDown evet, sadece basit tutmak istedim. Önerdiğin şey elbette işleri hızlandıracak. Bu yüzden cevabımın sonunda yavaş olduğuna dair sorumluluk reddi var.
terdon

8

Kısa cevap: evet.

Uzun versiyon: wikipedia fdupes girişine bir göz atın, hazır çözümler için oldukça hoş bir spor listesi. Tabii ki o değil, kendi yazabilirsiniz bu gibi karma programlar - Zor diff, sha*sum, find, sortve uniqiş yapmak gerekir. Hatta bir satırda bile koyabilirsiniz ve bu hala anlaşılabilir olacaktır.


6

Bir karma işlevinin (burada MD5) etki alanınızda çarpışma içermediğini düşünüyorsanız:

find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
 | cut --characters=35-

Aynı dosya adlarını gruplandırmak ister misiniz? not_uniq.shÇıktıyı formatlamak için basit bir script yazın :

#!/bin/bash

last_checksum=0
while read line; do
    checksum=${line:0:32}
    filename=${line:34}
    if [ $checksum == $last_checksum ]; then
        if [ ${last_filename:-0} != '0' ]; then
            echo $last_filename
            unset last_filename
        fi
        echo $filename
    else
        if [ ${last_filename:-0} == '0' ]; then
            echo "======="
        fi
        last_filename=$filename
    fi

    last_checksum=$checksum
done

Ardından findkomut dosyanızı kullanmak için komutu değiştirin :

chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh

Bu temel bir fikir. Muhtemelen finddosya adınız bazı karakterler içeriyorsa değiştirmelisiniz . (örneğin alan)


6

Ben fdupes, bir son geliştirilmiş çatal eklemek düşünülen jdupes olacağa benziyor, hızlı ve fdupes daha fazla özelliğe sahip (örneğin boyut filtresi):

jdupes . -rS -X size-:50m > myjdups.txt

Bu, geçerli dizinde 50 MB'den büyük kopyalanan dosyaları tekrarlı olarak bulur ve sonuçta elde edilen listeyi myjdups.txt dosyasında çıkarır.

Not, çıktının boyuta göre sıralanmadığını ve içeride görünmediğinden, bunu elde etmek için yukarıdaki @Chris_Down cevabını uyarladım:

jdupes -r . -X size-:50m | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n > myjdups_sorted.txt

Not: jdupes'in en son sürümü, her şeyi özetlemek için beklemek yerine, yalnızca kısmi bir karma olan dosyaları eşleştirmeyi destekler. Çok kullanışlı. (Gitmek için git arşivini klonlamanız gerekir.) Şu anda kullandığım seçenek: jdupes -r -T -T --exclude = size-: 50m - nohidden
Benjamin

2

Vikipedi, bu görev için mevcut açık kaynaklı yazılımların bir listesini içeren bir makaleye ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders ) sahipti , ancak şimdi silindi .

Fslint'in GUI versiyonunun çok ilginç olduğunu ekleyerek, hangi dosyaların silineceğini seçmek için maskenin kullanılmasına izin vereceğim. Çoğaltılmış fotoğrafları temizlemek için çok kullanışlıdır.

Linux'ta kullanabilirsiniz:

- FSLint: http://www.pixelbeat.org/fslint/

- FDupes: https://en.wikipedia.org/wiki/Fdupes

- DupeGuru: https://www.hardcoded.net/dupeguru/

Birçok sistemde son 2 çalışma (pencere, mac ve linux) FSLint için kontrol edilmedim


5
Burada gerçek bir bilgi vermek daha iyidir, sadece bir link değil, link değişebilir ve sonra cevabın değeri kalmaz
Anthon

2
Wikipedia sayfası boş.
ihor_dvoretskyi 10:15

evet, temizlendi, ne yazık oldu ...
MordicusEtCubitus

Bu 3 araçla düzenleme yaptım
MordicusEtCubitus

0

İşte benim bu konuda benim:

find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
  echo -n '.'
  if grep -q "$i" md5-partial.txt; then echo -e "\n$i  ---- Already counted, skipping."; continue; fi
  MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
  MD5=`echo $MD5 | cut -d' ' -f1`
  if grep "$MD5" md5-partial.txt; then echo "\n$i  ----   Possible duplicate"; fi
  echo $MD5 $i >> md5-partial.txt
done

Dosyanın yalnızca ilk 1 MB'ına kadar karma olması farklıdır.
Bunun birkaç sorunu / özelliği var:

  • İlk 1 MB'dan sonra bir fark olabilir, bu nedenle sonuç kontrol etmek için bir adaydır. Bunu daha sonra düzeltebilirim.
  • Önce dosya boyutuna göre kontrol etmek bunu hızlandırabilir.
  • Yalnızca 3 MB'den büyük dosyaları alır.

Video klipleri karşılaştırmak için kullanıyorum, bu yüzden bu benim için yeterli.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.