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


26

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

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

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

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

11
.и ..уже существует. И точка не имеет особого значения.
Ctrl-Alt-Delor

2
Интересно, можете ли вы создать файлы с именем .или ..из Windows на внешнем FATили NTFSносителе, а затем попытаться смонтировать это в систему на основе Unix. Хм ...
IQAndreas

3
@IQAndreas Нет, Windows использует. и .. примерно таким же образом ( superuser.com/a/571364/330318 ), как это делает Unix. (И чертовски много других специальных имен: superuser.com/a/217526/330318 )
PTwr

2
@PTwr История Windows сложнее, чем это. Некоторые особые вещи происходят на уровне файловой системы / NT API, некоторые в подсистеме Win32, а некоторые и на уровне оболочки. Например, волшебство GUID из вашей второй ссылки находится на уровне оболочки, поэтому вы не увидите их в типичном приложении командной строки. Я не уверен, существуют ли они в NTFS и NT API .и ..действительно ли они добавляются только Win32 API. Я знаю, что существует несколько несоответствий между NT API более низкого уровня и Win32, например, Win32 скрывает несколько файлов от корня диска.
CodesInChaos

@CodesInChaos, насколько я знаю, точка / точка являются виртуальными экземплярами и эмулируются в драйвере файловой системы, и это было то же самое в старом FAT, который заимствовал ( проблемную ) идею из Unix. Что касается второй ссылки, я признаю, что не прочитал ее полностью перед публикацией. Что-то вроде этого , вероятно, будет лучше. (но опять же, этому не хватает полной информации ./ .. информация)
PTwr

Ответы:


25

.. не особенный, просто он уже существует.

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

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

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

Однако вы можете создавать файлы ..., \, , .. (примечание есть пространство после .., но вы вряд ли можете увидеть его здесь, или просто в вас распечатку каталога) или любое другое имя вам нравится; Только зарезервирован характер /(Внимание - современные детали: и нуль, нуль является специальным символом, для чего не используется , кроме как отметить конец вещей , а иногда и в качестве разделителя). .не имеет особого значения: не для имен файлов, ядра или оболочки, его не нужно экранировать. На самом деле, если имя файла начинается с, .то оно особенное, файл обычно скрыт, но все же не нуждается в экранировании.

В стороне

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

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

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

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

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

1
Что вы имеете в виду If you move to . it is effectively a no operation? Это не «нет операции», это ошибка, если вы пытаетесь переместить файл из A в B, когда A и B - это одно и то же. Более практической демонстрацией этой ошибки является mv foo ../some_dir/fooили mv foo some_subdir/../foo.
Брандин

7
Для некоторых определений «символа» NUL (0x00) также запрещено использовать в именах файлов и каталогов.
user117529

1
Различие между зарезервированным символом (то есть /и NUL) и зарезервированным именем (то есть .и ..) может быть сделано более ясным. Также стоит отметить, что .в начале имя имеет особое значение только на уровне приложения, а не в ядре или системном вызове API.
Касперд

Я думаю, что ваше пространство потеряно.
nyuszika7h

1
..и . являются особенным: вы не можете переместить или удалить их. Но они не являются особенными при перемещении файлов к ним.
reinierpost

52

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

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

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


9

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

Я собираюсь рассказать вам, как это было раньше.

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

+1 за урок истории, и добавление чего-то, что не покрыто должным образом.
Ctrl-Alt-Delor
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.