deduplikacio

Sziasztok!

Neha van olyan jellegu adat, amit nem valtoztatunk, de sok duplikalt file van benne. Ilyenkor a tobbszor szereplo file-okat lecserelhetjuk hard linkre minden hatrany nelkul. (lehetne symlink is, de akkor torlesnel figyelni kell, hogy a link torlodjon, es ne az adatot is tartalmazo file)
Storage-nal nyilvan lehetne okosabban is, vagy mondjuk binary diff-et is nezhetnenk, meg hasonlokat.. de erre nem volt szuksegem.

Az alabbi bash script a kovetkezot teszi: az aktualis konyvtarban rekurzivan kiszamolja minden file md5 checksumjat, majd az azonosak tartalman vegigmegy, hogy tenyleg egyezik-e (bar kicsi az utkozes valoszinusege). Ha egyezik, akkor torli az egyiket, es a torolt file neven hard linket hoz letre a masik, vele azonos file-ra. Termeszetesen ha valtoztatjuk a file tartalmat, akkor a masik is meg fog valtozni, szoval ilyenekre nem jo..
Az ures file-okat nem tekinti azonosnak, erre egyeb okom volt (egyreszt nem foglal sokat, masreszt elakadt torrentek eseten nem az igazi..)
Ronda, biztos lehetne reszeit szebben is, de nekem jol jott.
A lefuttatott parancsokat (es jelenleg az md5 checksum-okat) beteszi 1-1 file-ba. A space-t tartalmazo filenevekre kulon figyeltem, birja.


#!/bin/bash                    

function ize
{           
  IFS=`echo ""` #csak ujsor..
  md='-1'                    
  nev=''                     
  while read sor             
  do                         
    oldmd="${md}"
    oldnev="${nev}"
    md=`echo $sor|cut -b 1-32`
    nev=`echo $sor|cut -b 35-`
    if [ "x${md}" == "x${oldmd}" ]
    then
      if cmp -s "${nev}" "${oldnev}" && ! cmp -s /tmp/emptyfile "${oldnev}"
      then
        echo rm "${oldnev}" >>dedupl.log
        echo ln "${nev}" "${oldnev}" >>dedupl.log
        rm "${oldnev}"
        ln "${nev}" "${oldnev}"
      fi
    fi
  done
}

echo -n >/tmp/emptyfile
echo -n >dedupl.log
#find . -type f|xargs -d "\n" -n 1 md5sum | sort | ize
find . -type f|xargs -d "\n" -n 1 md5sum |tee md5sums.txt| sort | ize

Hozzászólások

man uniq

uniq -d

vagy még inkább

uniq -D -z -w 16

és

sort -z

ha tudják a parancsok a fenti kapcsolókat.

(ize helyett, aztán elágazhatsz)

a findnak meg -print0 vagy fprint0, xargs helyett/mellett talán aw, főleg ha vannak jó kis locale charset fájlok, meg kettősponty, dollárjel, sóköz, stb...

ami át van húzva, azt teljesen fölösleges elolvasni. az olyan, mintha ott sem lenne