Как переименовать файл в … (точка точка)?

Очевидно, вы можете переименовать файл в ...

Если бы я был сумасшедшим, как бы переименовать файл на .. или . ? Возможно ли такое имя файла?

Обратная косая черта, похоже, не отключает специального значения точки:

 $ mv test \. mv: `test' and `./test' are the same file 

Вы не можете переименовать файл . или .. потому что все каталоги уже содержат записи для этих двух имен. (Эти записи указывают на каталоги, и вы не можете переименовать файл в каталог.)

mv обнаруживает случай, когда пункт назначения является существующим каталогом, и интерпретирует его как запрос на перемещение файла в этот каталог (с использованием его текущего имени).

Обратные косые черты не имеют к этому никакого отношения, потому что . не является метасимволом оболочки. \. и . одинаковы для bash .

.. не является особенным, просто он уже существует.

В Unix, Dos и MS-Windows каждый каталог имеет каталог . он ссылается на себя и на каталог .. он ссылается на родительский каталог (или self if root directory).

Если .. и . являются особенными, потому что вы не можете их удалить (на самом деле вы можете просто удалить каталог, который их содержит).

Поэтому вы не можете назвать какой-либо (другой) файл . или ..

Однако вы можете создавать файлы ... , \ , , .. (обратите внимание, что есть пробел после .. , но вы вряд ли сможете увидеть его здесь или просто в списке каталогов) или любое другое имя, которое вам нравится; Единственным зарезервированным символом является / (Warning – advanced details: and null, null – специальный символ, который не используется ни для чего, кроме как для обозначения конца, а иногда и для разделителя). . не имеет особого значения: не для имен файлов, ядра или для оболочки, для этого не требуется экранирование. На самом деле, если имя файла начинается с a . то он является особым, файл обычно скрыт, но при этом ему не требуется экранирование.

В стороне

Это скрытое поведение файла произошло в ранней реализации ls где автор хотел скрыть . и .. , поэтому они написали код, чтобы скрыть любые файлы, начиная с . , Другие пользователи заметили эту ошибку / функцию и начали создавать файлы, начиная с . когда они хотели, чтобы файл был скрыт.

Объяснение связанного вопроса

В вопросе, который вы ссылаетесь на вопросника, вы пытаетесь переместить файл в родительский каталог .. но заканчивается переименованием в ... , файлы, начинающиеся с точки, по умолчанию скрыты, поэтому они не могут их найти.

При использовании mv в форме mv ab

  • Если вы перейдете . это фактически не операция, но mv рассматривает ее как ошибку.
  • Если вы перейдете к .. он переместит файл в родительский каталог.

Проблема в том, что вы перемещаете файл в каталог. Это разрешено.

Я расскажу вам, как это было.

mkdir использовал, чтобы по-настоящему прочитать это (в то время как я пишу это в sh, он был действительно написан в C и setuid-root).

 mknod d $1 ln -d $1 $1/. ln -d `dirname $1` $1/.. 

Таким образом, вы можете видеть, что в этом нет особого значения. и .. за исключением того факта, что они созданы для вас mkdir и уже существуют. Теперь есть код, в котором говорится, что вы не можете удалить их, но это не всегда так.

rmdir имел обыкновение выглядеть так:

 rm -d $1/.. rm -d $1/. rm -d $1