k47.cz  — každý den dokud se vám to nezačne líbit
výběr foto Praha povídky kultura
TECH ▞▞ kolo | twitter RSS

Detekce duplicitních souborů

1. 8. 2011 — k47 (CC by) (♪)

Jed­no­du­chý Scala skript, který de­te­kuje a vypíše du­pli­citní sou­bory. Hodí se pro pro­ma­zá­vání ga­le­rií ob­rázků sta­že­ných z 4chanu.

UPDATE (pod­statně rych­lejší verze, pro­tože napřed po­rov­nává ve­li­kosti sou­borů a pak teprve vy­po­čítá hashe)

import java.io
import java.security.MessageDigest
import java.nio.channels.FileChannel.MapMode._

def makeHash(file: io.File) = {
  val md = MessageDigest.getInstance("MD5")
  val stream = new io.FileInputStream(file)
  val buffer = stream.getChannel.map(READ_ONLY, 0, file.length)

  md.update(buffer)
  val md5 = BigInt(md.digest())
  stream.close()
  md5
}

val files = (new io.File(".").listFiles
  .filter(_.isFile)
  .groupBy(_.length)     // Map[Long, Seq[File]]
  .valuesIterator        // Seq[Seq[File]]
  .filter(_.size > 1)    // multiple files with same size
  .flatMap { fs =>       // we must go deeper!
    (fs                  // Seq[File]
    .groupBy(makeHash _) // Map[BigInt, Seq[FileHash]]
    .values              // Seq[Seq[File]]
    .filter(_.size > 1)  // has duplicates
    .map(_.tail)         // only duplicates
    )
  }
)

for(f <- files.flatten) println(f)

U každé du­pli­city (trupli­city, kvadrupli­city atd.) jsou vy­psány všechny sou­bory kromě jed­noho. Takže všechny vy­psané sou­bory můžeme bez­pečně smazat:

rm $(scala -savecompiled dupl.scala)

(první verze)

píše k47 & hosté, ascii@k47.cz