k47.cz
mastodon twitter RSS
bandcamp explorer

Detekce duplicitních souborů

Jednoduchý Scala skript, který detekuje a vypíše duplicitní soubory. Hodí se pro promazávání galerií obrázků stažených z 4chanu.

UPDATE (podstatně rychlejší verze, protože napřed porovnává velikosti souborů a pak teprve vypočí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 the same size
  .flatMap { fs => fs          // Seq[File]
    .groupBy(f => makeHash(f)) // 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é duplicity (truplicity, kvadruplicity atd.) jsou vypsány všechny soubory kromě jednoho. Takže všechny vypsané soubory můžeme bezpečně smazat:

rm $(scala -savecompiled dupl.scala)

(první verze)

píše k47, ascii@k47.cz