По сути, в Python или bash я могу переименовать каталог с другим именем из этого каталога: в этот момент, внутри каталога, старое имя все еще отображается, но переименование фактически уже произошло.
На макросах с APFS это произошло в скрипте Python, который я писал для переименования каталогов в соответствии с определенным соглашением об именах, которое я использую, и я заметил это поведение.
Я публикую это как posix / shell / macos, так как я наполовину ожидаю, что это произойдет также и в Linux, и я получил такое же общее поведение от zshell.
Допустим, у меня естьdirectory, foo
:
(venv) jluc@test$ tree
.
└── foo
Я переименую его в bar с помощью 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
Что, во имя Шредингера, происходит? Обеспечивает ли это схему inode, лежащую в основе файловой системы APFS? Могут ли разные файловые системы, такие как ext4, например, также демонстрировать такое же поведение?
Обновление: если у меня есть отдельный текстовый файл в моем каталоге тестирования, я могу cat
содержимое файла до и после локального переименования. , так что это не просто оболочка - файловая система также сотрудничает. Текущий каталог все еще действителен и работоспособен (что будет соответствовать ответу @that другого парня).