Rimozione di file duplicati, mantenendo solo il file più recente


0

Sto cercando di ripulire una cartella di dump delle foto, in cui diversi file sono duplicati ma con nomi di file diversi o persi nelle sottocartelle.

Ho esaminato strumenti come rmlint, duff e fdupes, ma non riesco a trovare un modo per far sì che mantengano solo il file con il timestamp più recente. Sospetto di dover postelaborare i risultati, ma non so nemmeno da dove cominciare a farlo.

Qualcuno può guidarmi su come ottenere la lista dei file duplicati ed eliminare tutto tranne il file più recente?


Quanto sei a tuo agio con lo scripting di shell?
Ankur

Relativamente competente, ma non so da dove cominciare con questo compito.
pinkie_d_pie_0228

Risposte:


1

Nota che uso la shell zsh.

Prova qualcosa di simile al seguente (non verificato, basato su https://github.com/lipidity/btrfs-fun/blob/master/dedup ):

# checksum everything in ${DIR}
cksums=$(mktemp)
find ${DIR} -xdev -type f -print0 | xargs -0 md5sum > $cksums

# loop through each md5 hash found
for hash in $(sort $cksums | uniq -w 32 -d | cut -c 1-32); do
  # list of files with this hash
  files=$(grep $hash $cksums | cut -c 35-)
  f=(${(f)files})
  unset files
  # $f now contains array of files with the same checksum
  # compare the first file to the rest, deleting any that are older
  newest=$f[1]
  for file in $f[2,-1]; do
    # make sure the files are still the same
    cmp $newest $file || continue
    # remove the older file
    if [[ $file -nt $newest ]]; then
      rm $newest
      newest=$file
    else
      rm $file
    fi
  done
done

Non testato, ma dovresti prenderti la maggior parte del modo. Fammi sapere se qualcosa ha bisogno di ulteriori spiegazioni.


Aah, non sapevo che bash potesse confrontare i file in tempo come quello (appena provato, il confronto funziona bene in bash)! Sì, quel loop interno è praticamente ciò di cui avevo bisogno. Molte grazie!
pinkie_d_pie_0228

0

Vorrei echo il checksum generato usando il sum comando e nome file di ciascuno dei vari file, quindi ordinare per checksum. Puoi verificare che quelli con lo stesso checksum siano effettivamente duplicati usando cmp.


Tutti e 3 i cercatori duplicati che ho menzionato lo fanno già. Quello che voglio è conservare solo il file più recente.
pinkie_d_pie_0228

ls ordinerà per data. Non mi ero reso conto che quello fosse l'ostacolo, non il paragone.
Nicole Hamilton
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.