it-swarm-tr.com

Yinelenen dosyaları sabit bağlantılarla değiştirmenin kolay bir yolu var mı?

Ben kolay bir yol (bir komut veya komutlar dizisi, muhtemelen find) içeren iki dizinde yinelenen dosyaları bulmak ve bir dizindeki dosyaları diğer dizindeki dosyaların hardlink ile değiştirmek için arıyorum.

Durum şu şekildedir: Bu, her kullanıcının kendi klasörü olan birden fazla kişinin ses dosyalarını depoladığı bir dosya sunucusudur. Bazen birden fazla kişi aynı ses dosyalarının kopyalarına sahip olabilir. Şu anda bunlar kopyalar. Bunu yapmak istiyorum, böylece sabit disk alanından tasarruf etmek için hardlinkler.

146
Josh

http://cpansearch.Perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl adresinde tam olarak ne istediğinizi yapan bir Perl betiği vardır:

Komut satırında adlandırılan tüm dizinlerde gezinin, MD5 sağlama toplamlarını hesaplayın ve aynı MD5'e sahip dosyaları bulun. Eşitlerse, gerçekten eşitlerse gerçek bir karşılaştırma yapın, iki dosyadan ikincisini ilk dosyaya sabit bir bağlantıyla değiştirin.

42
fschmitt

rdfind tam olarak ne istediğinizi yapar (ve sırayla johny neden listeler). Kopyaları silmeyi, yumuşak veya sabit bağlantılarla değiştirmeyi mümkün kılar. symlinks ile birleştiğinde, sembolik bağlantıyı mutlak veya göreli yapabilirsiniz. Sağlama toplamı algoritmasını (md5 veya sha1) bile seçebilirsiniz.

Derlendiğinden, çoğu betikli çözümden daha hızlıdır: time bir 15 GiB klasöründe Mac Mini'm 2009'dan 2600 dosyaya sahip)

9.99s user 3.61s system 66% cpu 20.543 total

(md5 kullanarak).

Çoğu paket işleyicisinde kullanılabilir (örn. Mac OS X için MacPorts).

98
d-b

fdupes aracını kullanın:

fdupes -r /path/to/folder, dizindeki yinelemelerin bir listesini verir (-r, özyinelemeli yapar). Çıktı şöyle görünür:


dosyaAdı1
DosyaAdı2

dosyaAdı3
Filename4
Filename5


dosyaadı1 ve dosyaadı2 aynı, dosyaadı3, dosyaadı4 ve dosyaadı5 de aynıdır.

51
tante

http://jak-linux.org/projects/hardlink/ adresinden hardlink kullanıyorum

24
waltinator

Bu "fslint" tarafından sağlanan işlevlerden biridir - http://en.flossmanuals.net/FSlint/Introduction

"Birleştir" düğmesini tıklayın:

Screenshot

18
LJ Wobker

Ana hedefiniz disk alanından tasarruf etmek olduğundan başka bir çözüm daha vardır: dosya sistemi düzeyinde çoğaltma (ve muhtemelen sıkıştırma). Sabit bağlantı çözümüyle karşılaştırıldığında, diğer bağlantılı dosyaları yanlışlıkla etkileme sorunu yoktur.

ZFS, havuz sürümü 23'ten bu yana yinelenenleri kaldırma (blok düzeyi, dosya düzeyi değil) ve uzun zaman önce sıkıştırma var. Linux kullanıyorsanız, zfs-Fuse veya BSD kullanıyorsanız, yerel olarak desteklenir.

14
Wei-Yin

Modern Linux'ta bu günlerde https://github.com/g2p/bedup bir btrfs dosya sisteminde kopyaları çoğaltır, ancak 1) tarama ek yükü olmadan, 2) dosyalar kolayca ayrılabilir sonra tekrar.

7
Matthew Bloch
aptitude show hardlink

Açıklama: Aynı dosyanın birden çok kopyasını Hardlink Hardlink, aynı dosyanın birden çok kopyasını algılayan ve bunları sabit bağlantılarla değiştiren bir araçtır.

Fikir http://code.google.com/p/hardlinkpy/ adresinden alınmıştır, ancak kod sıfırdan yazılmıştır ve MIT) Ana sayfa: http://jak-linux.org/projects/hardlink/

6
Julien Palard

Yinelenen dosyaları bulmak için duff kullanabilirsiniz.

Duff, belirli bir dosya kümesindeki kopyaları hızlı bir şekilde bulmak için bir Unix komut satırı yardımcı programıdır.

Basitçe çalıştırın:

duff -r target-folder

Bu dosyalara otomatik olarak bağlantı oluşturmak için, duff çıktısını bash veya başka bir komut dosyasıyla ayrıştırmanız gerekir. dil.

6
Stefan

Burada bahsettiğimiz Linux için birçok bağlantı aracını kullandım. Ben de Ubuntu üzerinde ext4 fs ile sıkışmış ve sert/softlinking için cp -l ve s kullanıyorum. Ancak son zamanlarda cp man sayfasında hafif kopya, farkedilen disk alanını boşaltmak anlamına gelen kadar bir taraf değiştirilir:

   --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.
4
Marcos

jdupes bir yorumda belirtildi, ancak kendi cevabını hak ediyor, çünkü muhtemelen çoğu dağıtımda mevcut ve oldukça hızlı çalışıyor (yaklaşık% 98'lik bir tam 158GB bölümünün (SSD sürücüsü) 2.7GB'ını serbest bıraktı bir dakika) :

jdupes -rL /foo/bar

Bana ilk önce dosya adını kontrol etmenin işleri hızlandırabileceğini düşünüyorum. İki dosya aynı dosya adına sahip değilse, çoğu durumda bunların kopya olduğunu düşünmezdim. En hızlı yöntemin sırayla karşılaştırmak olacağı anlaşılıyor:

  • dosya adı
  • boyut
  • md5 sağlama toplamı
  • bayt içeriği

Bunu yapmak için herhangi bir yöntem var mı? duff, fdupes, rmlint, fslint vb.

Aşağıdaki yöntem commandlinefu.com üzerinde en üst oyu almıştır: Yinelenen Dosyaları Bul (önce boyuta, sonra MD5'e göre) karma)

Dosya adı karşılaştırması ilk adım, boyut olarak ikinci adım olarak eklenebilir mi?

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
4
johny why

Perl hayranı olmadığım için işte bir bash versiyonu:

#!/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

Bu, aynı sağlama toplamı olan tüm dosyaları bulur (büyük, küçük veya zaten sabit olsa da) ve bunları birbirine bağlar.

Bu, ek bulma bayrakları (örn. Boyut) ve bir dosya önbelleği ile tekrarlanan çalışmalar için büyük ölçüde optimize edilebilir (böylece her seferinde sağlama toplamlarını yeniden yapmanız gerekmez). Daha akıllı, daha uzun versiyonla ilgilenen varsa, gönderebilirim.

NOT: Daha önce de belirtildiği gibi, dosyalar asla modifikasyona ihtiyaç duymadığı veya dosya sistemleri arasında taşınmayacağı sürece, hardlinkler çalışır.

3
seren

Yinelenenleri mac veya herhangi bir UNIX tabanlı sistemdeki Sabit Bağlantılarla değiştirmek isterseniz, SmartDupe'yi deneyebilirsiniz http://sourceforge.net/projects/smartdupe/ geliştiriyorum

1
islam

Bahsettiğinize benzer bir şey yapan bir Perl betiği yaptım:

http://Pastebin.com/U7mFHZU7

Temel olarak, sadece bir dizinde gezer, içindeki dosyaların SHA1 toplamını hesaplar, hash eder ve eşleşmeleri birbirine bağlar. Birçok kez kullanışlı oluyor.

1
amphetamachine

FSLint uygulamaları ( http://www.pixelbeat.org/fslint/ ) herhangi bir klasördeki (içeriğe göre) tüm eşit dosyaları bulabilir ve sabit bağlantılar oluşturabilir. Bir şans ver!

Jorge Sampaio

1

Sabit bağlantılar en iyi fikir olmayabilir; bir kullanıcı dosyayı değiştirirse her ikisini de etkiler. Ancak, sabit bir bağlantıyı silmek her iki dosyayı da silmez. Ayrıca, Sabit Bağlantıların aynı dosyanın birden çok kopyasıyla aynı sabit alana (sabit diskte, işletim sisteminde değil) sahip olup olmadığından tamamen emin değilim; Windows'a göre (Link Shell Uzantısı ile) yaparlar. Verilmiş, bu Windows, Unix değil ...

Benim çözümüm gizli bir klasörde "ortak" bir dosya oluşturmak ve gerçek kopyaları sembolik linklerle değiştirmek olacaktır ... o zaman, sembolik linkler meta veri veya sadece iki "dosyayı" kaydeden alternatif dosya akışlarına gömülür. bir kişi dosya adını değiştirmek veya özel albüm resmi veya bunun gibi başka bir şey eklemek istiyorsa birbirinden farklıdır; aynı oyunun veya yazılımın birden çok sürümünün yüklü olması ve en küçük farklarla bile bağımsız olarak test edilmesi gibi veritabanı uygulamalarının dışında bile yararlı olabilir.

0
Amaroq Starwind

Sabit bağlantılar yapacaksanız, bu dosyadaki haklara dikkat edin. Uyarı, sahip, grup, mod, genişletilmiş öznitelikler, zaman ve ACL (bunu kullanırsanız) INODE içinde saklanır. Yalnızca dosya adları farklıdır, çünkü bu dizin yapısında saklanır ve diğer INODE özelliklerine işaret eder. Bu nedenle, aynı inode'a bağlı tüm dosya adları aynı erişim haklarına sahiptir. Herhangi bir kullanıcı diğerine dosyaya zarar verebileceğinden, bu dosyanın değiştirilmesini önlemelisiniz. Basit. Bu, herhangi bir kullanıcının aynı ada başka bir dosya koyması yeterlidir. Daha sonra inode numarası kaydedilir ve tüm sabit bağlantılı isimler için orijinal dosya içeriği yok edilir (değiştirilir).

Daha iyi bir yol dosya sistemi katmanında tekilleştirme. BTRFS (son kez çok popüler), OCFS veya benzeri kullanabilirsiniz. Sayfaya bakın: https://en.wikipedia.org/wiki/Comparison_of_file_systems , özellikle Özellikler ve sütun veri tekilleştirme tablosunda. Tıklayabilir ve sıralayabilirsiniz :)

Özellikle ZFS dosya sistemine bakın. Bu Sigorta olarak mevcuttur, ancak bu şekilde çok yavaştır. Yerel destek istiyorsanız, http://zfsonlinux.org/ sayfasına bakın. Sonra çekirdeği yamalı ve bir sonraki yönetim için zfs araçlarını yüklemelisiniz. Linux'un neden sürücü olarak desteklemediğini anlamıyorum, diğer birçok işletim sistemi/çekirdeği için bir yol.

Dosya sistemleri, tekilleştirme işlemini 2 yolla, tekilleştirme dosyalarını veya blokları destekler. ZFS bloğu destekler. Bu, aynı dosyada tekrarlanan içeriklerin tekilleştirilebileceği anlamına gelir. Diğer yol, verilerin tekilleştirildiği zamandır, bu çevrimiçi (zfs) veya çevrimdışı (btrfs) olabilir.

Veri tekilleştirme RAM tüketir. Bu nedenle, Fuse ile monte edilmiş ZFS birimine dosya yazmak, önemli ölçüde yavaş performansa neden olur. Bu belgelerde açıklanmaktadır. Ancak, ses düzeyinde çevrimiçi tekilleştirme özelliğini açabilir/kapatabilirsiniz. Herhangi bir verinin tekilleştirilmesi gerektiğini görürseniz, tekilleştirmeyi açık olarak ayarlayabilir, bazı dosyaları geçici olarak yeniden yazabilir ve sonunda değiştirebilirsiniz. bundan sonra tekilleştirmeyi kaldırabilir ve tam performansı geri yükleyebilirsiniz. Tabii ki, herhangi bir önbellek diskini depolamaya ekleyebilirsiniz. Bu çok hızlı döndürme diskleri veya SSD diskler olabilir. Tabii ki bu çok küçük diskler olabilir. Gerçek işte bu RAM :) yerine geçer

Linux altında ZFS'ye dikkat etmelisiniz çünkü hepsi olması gerektiği gibi çalışmaz, özellikle dosya sistemini yönetirken, anlık görüntü verirken vb. Ancak yapılandırma yapar ve değiştirmezseniz, hepsi düzgün çalışır. Aksi takdirde, linux'u opensolaris olarak değiştirmelisiniz, doğal olarak ZFS'yi destekler :) ZFS ile çok güzel olan şey, bu hem dosya sistemi hem de LVM'ye benzer hacim yöneticisi olarak çalışır. ZFS kullandığınızda buna ihtiyacınız yoktur. Daha fazla bilgi için belgelere bakın.

ZFS ve BTRFS arasındaki fark dikkat edin. ZFS daha yaşlı ve daha olgun, ne yazık ki sadece Solaris ve OpenSolaris altında (ne yazık ki Oracle tarafından boğulmuş). BTRFS daha genç, ancak son kez çok iyi destekleniyor. Taze çekirdek öneririm. ZFS, tümünün çevrimiçi olarak hesaplandığı için yazma işlemlerinin yavaşlamasına neden olan çevrimiçi veri tekilleştirme özelliğine sahiptir. BTRFS çevrim dışı veri tekilleştirmeyi destekler. Daha sonra bu performanstan tasarruf sağlar, ancak Host'un yapacak bir şeyi olmadığında, tekilleştirme yapmak için periyodik bir araç çalıştırırsınız. Ve BTRFS yerel olarak linux altında yaratılmıştır. Belki bu daha iyidir FS :)

0
Znik

En kolay yol dupeGuru özel programı kullanmaktır

dupeGuru Preferences Screenshot

as belgeler diyor

Silme Seçenekleri

Bu seçenekler yinelenen silme işleminin nasıl gerçekleştiğini etkiler. Çoğu zaman bunları etkinleştirmenize gerek yoktur.

Silinen dosyaları bağla:

Silinen dosyaların yerini referans dosyasına bir bağlantı alır. Bir symlink veya hardlink ile değiştirme seçeneğiniz vardır. ... bir sembolik bağ, dosyanın yoluna giden bir kısayoldur. Orijinal dosya silinir veya taşınırsa, bağlantı kopar. Sabit bağlantı, dosyanın kendisine bir bağlantıdır. Bu bağlantı “gerçek” bir dosya kadar iyidir. Yalnızca bir dosyaya yapılan tüm bağlantılar silindiğinde dosyanın kendisi silinir.

OSX ve Linux'ta bu özellik tam olarak desteklenir, ancak Windows altında biraz karmaşıktır. Windows XP desteklemiyor, ancak Vista ve üstü destekliyor. Ancak, özelliğin çalışması için dupeGuru yönetimsel ayrıcalıklarla çalışmalıdır.