Я пытаюсь очистить папку с дампом фотографий, в которой несколько файлов дублируются, но с разными именами файлов или теряются в подпапках.

Я смотрел на такие инструменты, как rmlint, duff и fdupes, но не могу найти способ заставить их хранить только файл с самой последней отметкой времени. Я подозреваю, что должен постобработать результаты, но я даже не знаю, с чего начать.

Кто-нибудь может подсказать мне, как получить список дубликатов файлов и удалить все, кроме самого нового файла?

2 ответа2

1

Обратите внимание, что я использую оболочку zsh.

Попробуйте что-то вроде следующего (не проверено; основано на 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

Не проверено, но должно пройти большую часть пути. Дайте мне знать, если что-то требует дальнейшего объяснения.

0

Я бы echo контрольную сумму, сгенерированную с использованием команды sum и имени файла каждого из различных файлов, а затем отсортировал по контрольной сумме. Вы можете проверить, что те с одинаковой контрольной суммой действительно являются дубликатами, используя cmp .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .