基本上,在 Python 或 bash 中,我可以在该目录中将目录重命名为不同的名称:此时,在目录中,旧名称仍然显示,但实际上重命名已经发生。
在带有 APFS 的 macos 上,这发生在我正在编写的 Python 脚本中,该脚本根据我使用的特定命名约定重命名目录,我注意到了这种行为。
我将其发布为 posix/shell/macos,因为我有一半希望在 Linux 下也会发生这种情况,并且我从 zshell 中得到了相同的一般行为。
假设我有一个目录foo
:
(venv) jluc@test$ tree
.
└── foo
我将其重命名为 bar withmv foo 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
. 它没有出错。在本地,apwd
表明我仍在同一目录中。我可以做一个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)。