Rozwiązanie problemu ze zduplikowanymi UID w mbsync/isync + mu4e

Objaw:

Maildir error: duplicate UID 2.

Przy uruchamianiu mbsync.

  1. Ustaw mu4e tak, aby nie powodowało duplikowania UID:
(setq mu4e-change-filenames-when-moving t)
  1. Rozwiąż aktualnie istniejące problemy z duplikatami:

Utwórz gdzieś w $PATH plik unuid.sh:

#!/bin/bash

# removes mbsync uid data from the filename so it can create a new uid for it
# see https://blog.kuba-orlik.name/kodzi/rozwiazanie-problemu-ze-zduplikowanymi-uid-w-mbsync-isync-mu4e

FUID=$1

if [ "$1" = "" ] ; then
  echo "No FUID given!";
  exit 1;
fi;

FILES=$(find . | grep ",U=$FUID")

while IFS= read -r FILE; do
   FILE_ABS="$(pwd)/$FILE"

   NEW_FILE_ABS=$(echo "$FILE_ABS" | sed 's/,U=.*//')

   echo mv "$FILE_ABS" "$NEW_FILE_ABS"
   mv "$FILE_ABS" "$NEW_FILE_ABS"
done <<< "$FILES"

Następnie znajdź wszystkie zduplikowane UID:

# (należy wykonać w ramach jednego folderu, nie np. tylko w katalogu /cur
$ find cur new -type f | awk -F,U= '{print $2}' | awk -F: '{print $1}' | sort | uniq -d

Za pomocą xargs odpal unuid.sh dla każdego ze zduplikowanych uid:

$ find  cur new  -type f | awk -F,U= '{print $2}' | awk -F: '{print $1}' | sort | uniq -d |
    xargs -L 1 unuid.sh

Wykonaj ponownie synchronizację mbsync-iem. Powinno teraz być ok.


Jeżeli dostajesz error

Maildir error: UID 123 is beyond highest assigner UID 12

To sprawdź, w jakim katalogu znajduje się ten plik, przejdź do tego katalogu i odpal

unuid.sh 123

I tak do skutku. Jak idków jest dużo, to możesz wykonać obydwa te kroki przy pomocy jednej komendy:

# będąc w katalogu, w którym są te duplikaty
$ mbsync -c ~/configs/mbsync channel-który-robi-kłopot  |& grep  'error' | grep -o -E '[0-9]+ is beyond' | sed 's/ is beyond//' | xargs -I {} unuid.sh {}