Por fin he descubierto la causa subyacente. Lo siguiente es una adaptación de mi entrada del blog con mis hallazgos.
Me conecté al shell del sistema operativo Linux subyacente del servidor original. Miré el directorio correspondiente en el sistema de archivos subyacente del servidor. Esto es lo que he visto (con un título de confidencialidad y simplificado para mayor claridad):
% ls -la /share/Volume/path/to/directory/with/duplicate/entries
total 56
drwxr-xr-x 1 myuser everyone 4096 Jan 3 2016 ./
drwxr-xr-x 1 myuser everyone 4096 Aug 24 00:21 ../
drwxr-xr-x 1 myuser everyone 4096 Aug 24 01:32 .externalToolBuilders/
drwxr-xr-x 1 myuser everyone 4096 Feb 20 2009 :2eexternalToolBuilders/
-rw-rw-rw- 1 myuser everyone 4096 Feb 20 2009 other_files
La observación crucial es el nombre del directorio, :2eexternalToolBuilders
. Comienza con la cadena ":2e", mientras que la otra entrada de directorio comienza con la cadena ".". Desde el punto de vista del sistema operativo y del sistema de archivos subyacentes, no hay entradas duplicadas en este directorio. Los dos directorios "externalToolBuilder" tienen nombres diferentes.
Las capas de software sobre el sistema operativo del servidor - muy probablemente el software netatalk AFP - interpretan que el prefijo ":2e" significa ".". Al presentar la entrada del directorio subyacente :2eexternalToolBuilders
a través de AFP a mi Mac, reescribe el nombre de la entrada a .externalToolBuilders
. No se da cuenta de que hay otra entrada llamada .externalToolBuilders
en ese directorio. El resultado es que mi Mac ve, en el servidor original, un directorio con una duplicación inesperada y que viola las reglas.
Sospecho que el uso del prefijo ":2e" en lugar del prefijo "." es una convención de la antigua Bloque de mensajes del servidor (SMB) software de servidor de archivos. SMB permitía que los archivos de Mac OS se almacenaran en los sistemas de archivos subyacentes de Windows. El sistema de archivos de Windows de la época no permitía nombres de archivos con un "." inicial. "2e" puede leerse como un código ASCII hexadecimal para el punto ".". Los dos puntos ":" pueden ser leídos como un carácter de escape, lo que significa que éste más los dos dígitos hexadecimales siguientes deben ser presentados como el carácter representado por los dígitos. Así, ":2e" en un nombre de entrada de directorio subyacente significa "." en el nombre de entrada de directorio presentado por el servidor.
Resulta que los datos del servidor original eran lo suficientemente antiguos como para haber sido copiados hacia adelante a través de múltiples versiones del servidor y del software del servidor. A veces accedía a través de SMB, y otras veces a través de AFP. Supongo que el directorio :2eexternalToolBuilders
se creó primero, y el directorio complementario .externalToolBuilders
se creó más tarde. Coexistieron, especialmente para los datos antiguos a los que no accedí. Sólo cuando utilicé Finder para copiar el directorio se hizo evidente el conflicto.
Especulo que el comportamiento inconsistente que vi en mi Mac, mirando el volumen presentado a través de AFP, es causado por las utilidades de Mac OS que tratan las entradas de directorio de manera diferente dependiendo de si buscan un nombre específico en un directorio, o enumeran todos los nombres. El software sin duda asumió que no puede haber nombres duplicados entre las entradas. Las utilidades que buscan un nombre específico encontrarán uno u otro de los duplicados, y se detendrán. No hay razón para buscar otro nombre, porque no debería existir ninguno. Las utilidades que enumeran todos los nombres, o todos los nombres que coinciden con un comodín, devuelven todas las entradas que coinciden, sin importarles que algunas sean duplicadas. El número de inodo duplicado puede explicarse porque el software enumera todos los nombres, y luego, para cada nombre, utiliza ese nombre para buscar el número de inodo correspondiente a ese nombre. El software que devuelve los números de inodo terminaría, por supuesto, su búsqueda con la misma entrada de directorio las dos veces, porque estaba buscando el mismo nombre las dos veces.
La solución para mí fue patrullar el sistema de archivos subyacente de mi servidor original, buscando casos de duplicados separados por prefijos "." y ":2e". Encontré unos cinco casos, con nombres como .externalToolBuilders
, .svn
, .libs
y .metadata
. Utilicé el comando shell para fusionar todos los archivos en la entrada con el prefijo ".", y luego eliminar la entrada con el prefijo ":2e". Esto eliminó la duplicación, y dejó que la copia del Finder tuviera éxito.