En corto

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apt install convmv                                   # dnf install convmv

# 1. Ver qué se renombraría (sin --notest, convmv solo simula)
convmv -f utf-8 -t utf-8 -r --nfc /var/www/nextcloud/data/alice/files

# 2. Aplicar
convmv -f utf-8 -t utf-8 -r --notest --nfc /var/www/nextcloud/data/alice/files

# 3. Que Nextcloud vuelva a indexar
sudo -u www-data php occ files:scan --all

Si los nombres vienen de un Windows o un Samba viejos y ni siquiera son UTF-8 (convmv los marca como not UTF-8): convmv -f iso-8859-1 -t utf-8 -r --notest <ruta>.

En Docker, el occ va dentro del contenedor: docker exec -u www-data nextcloud php occ files:scan --all (en la imagen de linuxserver.io, sudo -u abc php /config/www/nextcloud/console.php files:scan --all).

El error

1
Entry "Ñandú y Ñoño.pdf" will not be accessible due to incompatible encoding

Lo imprime occ files:scan. Los archivos están en disco, se ven con ls, pero no salen en la web, ni sincronizan, ni cuentan para el espacio. Aparece casi siempre después de copiar datos directamente al data directory (migraciones, rsync desde un Mac, un recurso SMB montado como external storage) en vez de subirlos por el cliente.

Por qué pasa

Unicode permite escribir “ñ” de dos formas: precompuesta (NFC, un solo code point) o descompuesta (NFD, una “n” más una tilde combinante). Se ven idénticas y son bytes distintos. macOS históricamente guarda los nombres en NFD (HFS+ los forzaba; APFS y el Finder siguen produciéndolos al copiar por SMB o rsync); Linux y Nextcloud trabajan en NFC. Nextcloud normaliza todos los nombres a NFC y descarta los que no puede casar con lo que hay en disco, de ahí el aviso.

El otro caso es más viejo: nombres en ISO-8859-1 (Latin-1) heredados de Windows o de un Samba sin unix charset = UTF-8. No son UTF-8 válido y Nextcloud tampoco los acepta.

Arreglo, con calma

  1. Modo mantenimiento para que ningún cliente sincronice a medias: occ maintenance:mode --on.
  2. Simula: convmv sin --notest lista cada renombrado que haría. Si aparecen archivos not UTF-8, esos van con -f iso-8859-1.
  3. Aplica con --notest. Si ya existe el gemelo en NFC (el mismo nombre subido dos veces), convmv lo salta y avisa; --replace sobrescribe, así que decide antes cuál es el bueno.
  4. occ files:scan --all (o --path=/alice/files/Fotos para un usuario o carpeta). El aviso desaparece y los archivos entran al índice.
  5. occ maintenance:mode --off.

convmv renombra con rename(): conserva dueño, permisos y fechas, y es instantáneo aunque sean cientos de miles de archivos.

Que no vuelva

  • Desde macOS, sube con el cliente de Nextcloud, que normaliza a NFC. Si copias con rsync, --iconv=utf-8-mac,utf-8 convierte los nombres en vuelo.
  • Samba como puente: vfs objects = fruit con fruit:encoding = native hace la conversión para clientes Mac; y unix charset = UTF-8 siempre.
  • External storage SMB/local: arregla los nombres en el origen; Nextcloud no renombra lo que no puede indexar.

Trampas

  • --notest es lo que aplica. Al revés de lo que uno espera: por defecto convmv es un simulacro.
  • Renombrar cambia el fileid. Para Nextcloud, el archivo NFD desaparece y nace uno NFC: los enlaces compartidos, comentarios y versiones de esos archivos se pierden. Avisa a los usuarios afectados antes.
  • ownCloud tiene el mismo comportamiento y el mismo occ.
  • Bases MySQL con utf8 de 3 bytes dan un error parecido pero distinto (emojis y CJK): ahí es occ db:convert-mysql-charset, no convmv.

Ver también: Seafile: recuperar espacio con seaf-gc y rsync: reanudar copias grandes (el --iconv). Referencia: hilo en help.nextcloud.com.