Perl的rename在APFS上做了一些奇怪的事情吗?

11

我认为这与iCloud Drive有关,但我还没有进行调查。


我正在尝试追踪使用苹果文件系统(APFS)的macOS上Perl的rename问题。我已经能够用至少5.12.3版本的perl复制此问题,但所有这些都是使用Apple LLVM版本9.1.0(clang-902.0.39.1)编译的。那些相同版本的perl在FAT或HFS+文件系统中没有这个问题。我没有在其他地方注意到这个问题。

  • 第一次运行它。 我最终得到了一个Changes和一个Changes.bak文件。 这正是我预期的。

  • 再次运行它。 你会得到一个Changes和一个Changes 3文件。 没有Changes.bak文件。 这很奇怪。

  • 再次运行它。 我得到一个Changes文件,一个Changes.bak文件和一个Changes 3文件。

  • 再次运行它。 我得到一个Changes文件,一个Changes 3文件和一个Changes 4文件。 再次没有Changes.bak文件。

  • 如果我删除print行,我无法获得此效果(“医生,我这样动我的手臂时很痛”)。

  • 我重新排列了文件句柄的打开和关闭,但似乎没有解决任何问题。

我认为在文件系统层面上发生了一些事情。 所以我真的有两个问题:

  • 这是一个错误吗? 在什么层面上? rename不能保证完成所有需要完成的工作,然后再开始处理文件句柄吗?

  • 我想读取旧文件并创建新文件,在其中插入一些数据。 复制头,插入新行,将所有旧行输出到新文件中。 我可以写到临时文件中,然后稍后移动它,但我还做错别的事情吗?

如果您可以重现此行为但不知道原因,请留下评论。 也许我的系统还有其他奇怪的地方。


my $changes = "Changes";
my $bak     = $changes . ".bak";

rename $changes, $bak or die "Could not backup $changes. $!\n";

open my $in, '<', $bak or die "Could not read old $changes file! $!\n";
open my $out, ">", $changes;

# comment this print line and there's no problem
print {$out} 'Hello';

close $out;
close $in;

3
rename(3pl) 简单地调用 rename(2)。Win32 和 VMS 会覆盖此功能(可参见此处),但据我所知,MacOS 没有这样做。请查看 rename(2)的手册页面? - ikegami
1
你的C程序表现一致吗? - ikegami
1
对我来说一切都正常。OSX 10.14.6和perl 5.18与apfs文件系统兼容。 - Skeeve
2
这是iCloud Drive和同步的问题。我还没有开发完整的演示。 - brian d foy
在重命名之前,也许你应该先执行 unlink($bak) - Bernhard M.
显示剩余5条评论
1个回答

1
我知道这是一个老问题,但这可能与一年前苹果文件系统处理中存在的错误相关。在某些情况下,我们遇到了文件元数据(mtime?)未正确设置的问题。
当您在perl、python、node等语言中遇到此类问题时,请尝试使用另一种语言执行相同操作,以查看是否出现相同的行为。如果是,那很可能是操作系统的错误(因为这些脚本语言通常只是c库的薄包装器)。
干杯。

谢谢。将目录从iCloud Drive(实际上是~/Desktop)中移出后,我就没有遇到这个问题了。现在它在Synology共享卷上,问题也没有再次出现。 - brian d foy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接