macos 中目录重命名的意外行为(其他 posix 风格?)

Posted

技术标签:

【中文标题】macos 中目录重命名的意外行为(其他 posix 风格?)【英文标题】:unexpected behavior of directory renaming in macos (other posix flavors?) 【发布时间】:2020-03-07 14:37:43 【问题描述】:

基本上,在 Python 或 bash 中,我可以在该目录中将目录重命名为不同的名称:此时,在该目录中,旧名称仍然显示,但实际上重命名已经发生。

在带有 APFS 的 macos 上,这发生在我正在编写的 Python 脚本中,该脚本根据我使用的特定命名约定重命名目录,我注意到了这种行为。

我将其发布为 posix/shell/macos,因为我有一半希望在 Linux 下也会发生这种情况,并且我从 zshell 中得到了相同的一般行为。

假设我有一个目录,foo:

(venv) jluc@test$ tree
.
└── foo

我用mv foo bar将它重命名为bar

(venv) jluc@test$ tree
.
└── bar

但是现在,让我们 cd 进入该目录并在那里执行重命名。

$cd bar
$pwd
/Users/jluc/kds2/wk/explore/test/bar
$ mv ../bar ../zoom
$ pwd
/Users/jluc/kds2/wk/explore/test/bar  ???? still the old name

所以,现在,在bar 内,我已将其重命名为zoom。它没有出错。在本地,pwd 表明我仍在同一目录中。我可以做一个ls 并且我不在一个无效的目录中,某些命令有时可以将我放入。

但是,上一级的树讲述的是不同的故事。

(venv) jluc@bar$ tree ..
..
└── zoom  ???? but here I see the new name

cd 到当前目录失败

cd `pwd`
-bash: cd: /Users/jluc/kds2/wk/explore/test/bar: No such file or directory

以薛定谔的名义,这是怎么回事?文件系统底层的 inode 方案 APFS 是否提供此功能?不同的文件系统(例如 ext4)是否也会表现出相同的行为?

更新:如果我的测试目录中有一个单独的文本文件,我可以cat 在本地重命名之前和之后的文件内容,所以它不仅仅是外壳 - 文件系统也可以协作。当前目录仍然有效且可操作(这符合@that other guy's answer)。

【问题讨论】:

这不是文件系统问题,它只是 bash(因此pwd)对你的位置有点过时了。 【参考方案1】:

有两件事在起作用:

    在 Unix 上,打开文件或目录的任何句柄通常不受重命名和删除的影响。 shell 会记住您所在的目录,它不会每次都重新查询。

#1 表示在大多数情况下,您可以删除或移动仍在使用的文件/目录,并且使用过程可以继续使用它直到完成。 #2 表示 shell 的 pwd 将只返回旧名称(尽管必须重新查询的外部 /bin/pwd 将失败)。

【讨论】:

那么,wrt #1,您认为这是内核级别的行为吗?我还可以cat 重命名目录中的文件内容,因此它不仅仅是打开的文件 是的,这绝对是内核级别的行为。由于这种行为,. 在移动后仍会引用相同的 inode,因此您仍然可以 cat 相对于它的文件。

以上是关于macos 中目录重命名的意外行为(其他 posix 风格?)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 macOS 终端中批量重命名文件?

重命名目录中的所有文件?

如何在 MacOS 中递归地重命名文件夹和文件

Git:重命名分支中的目录

apt无法重命名文件

阿波罗链接重试400错误的意外行为[关闭]