macos 中目录重命名的意外行为(其他 posix 风格?)
unexpected behavior of directory renaming in macos (other posix flavors?)
基本上,在 Python 或 bash 中,我可以将目录重命名为与该目录不同的名称:此时,在目录中,旧名称仍然显示,但重命名实际上已经发生了。
在带有 APFS 的 macOS 上,这是在我编写的 Python 脚本中出现的,该脚本根据我使用的特定命名约定重命名目录,我注意到了这种行为。
我将此作为 posix/shell/macos 发布,因为我有一半希望这也会在 Linux 下发生,并且我从 zshell.[=23 中得到了相同的一般行为=]
假设我有一个目录,foo
:
(venv) jluc@test$ tree
.
└── foo
我用 mv foo bar
将它重命名为 bar
(venv) jluc@test$ tree
.
└── bar
但是现在,让我们进入该目录并在那里执行重命名。
$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
以薛定谔的名义,这是怎么回事?文件系统 APFS 下的 inode 方案是否提供此功能?不同的文件系统(例如 ext4)是否也会表现出相同的行为?
更新:如果我的测试目录中有一个单独的文本文件,我可以 cat
在本地重命名前后的文件内容,所以它不仅仅是 shell -文件系统也可以协作。当前目录仍然有效且可操作(这符合@that other guy's answer)。
有两件事在起作用:
- 在 Unix 上,打开文件或目录的任何句柄通常不会受到重命名和删除的影响。
- shell会记住你所在的目录,不会每次都重新查询。
#1 表示在大多数情况下,您可以删除或移动仍在使用的 file/dir,并且使用过程可以继续使用它直到完成。 #2 意味着 shell 的 pwd
将只是 return 旧名称(尽管必须重新查询的外部 /bin/pwd
将失败)。
基本上,在 Python 或 bash 中,我可以将目录重命名为与该目录不同的名称:此时,在目录中,旧名称仍然显示,但重命名实际上已经发生了。
在带有 APFS 的 macOS 上,这是在我编写的 Python 脚本中出现的,该脚本根据我使用的特定命名约定重命名目录,我注意到了这种行为。
我将此作为 posix/shell/macos 发布,因为我有一半希望这也会在 Linux 下发生,并且我从 zshell.[=23 中得到了相同的一般行为=]
假设我有一个目录,foo
:
(venv) jluc@test$ tree
.
└── foo
我用 mv foo bar
(venv) jluc@test$ tree
.
└── bar
但是现在,让我们进入该目录并在那里执行重命名。
$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
以薛定谔的名义,这是怎么回事?文件系统 APFS 下的 inode 方案是否提供此功能?不同的文件系统(例如 ext4)是否也会表现出相同的行为?
更新:如果我的测试目录中有一个单独的文本文件,我可以 cat
在本地重命名前后的文件内容,所以它不仅仅是 shell -文件系统也可以协作。当前目录仍然有效且可操作(这符合@that other guy's answer)。
有两件事在起作用:
- 在 Unix 上,打开文件或目录的任何句柄通常不会受到重命名和删除的影响。
- shell会记住你所在的目录,不会每次都重新查询。
#1 表示在大多数情况下,您可以删除或移动仍在使用的 file/dir,并且使用过程可以继续使用它直到完成。 #2 意味着 shell 的 pwd
将只是 return 旧名称(尽管必须重新查询的外部 /bin/pwd
将失败)。