Rozwiązanie problemu ze zduplikowanymi UID w mbsync/isync + mu4e
Objaw:
Maildir error: duplicate UID 2.
Przy uruchamianiu mbsync
.
- Ustaw mu4e tak, aby nie powodowało duplikowania UID:
(setq mu4e-change-filenames-when-moving t)
- 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 {}