Strange behavior of `copyfile` regarding symlinks on Linux and macOS

1 min read Original article ↗

Consider the following function.

%test_copyfile.m

function test_copyfile()

system('rm -rf folder*; mkdir folder1; cd folder1; touch a b c d e f g; ln -s d dlink; rm d; cd ..');

success = copyfile('folder1','folder2');
assert(success);

fprintf('\nfolder1:\n');
dir('folder1')

fprintf('\nfolder2:\n');
dir('folder2')

assert(isequal({dir('folder1').name}, {dir('folder2').name}));

return

Running it in MATLAB R2023b on Ubuntu 22.04 or macOS 13 (Intel chip), I got the following result.

folder1:
  
.      ..     a      b      c      dlink  e      f      g      
  
  
folder2:
  
.   ..  b   f   
  
Error using assert
Assertion failed.
Error in test_copyfile (line 14)
assert(isequal({dir('folder1').name}, {dir('folder2').name}));

The test has been conducted on a few machines. It seems that the content of folder2 is not deterministic. Sometimes, it may be

folder2:
  
.   ..  a   g

or

folder2:
  
.   ..

But I have not recognized the pattern.

Is this expected?