如何将文件重命名为..(点点)?


26

显然,您可以将文件重命名为...

如果我疯了,我该如何将文件重命名为...?甚至允许这样的文件名吗?

反斜杠似乎并没有禁用dot的特殊含义:

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

11
.并且..已经存在。点没有特殊含义。
ctrl-alt-delor

2
我想知道是否可以在Windows外部或媒体上创建名为...从Windows 命名的文件,然后尝试将其安装到基于Unix的系统中。嗯...FATNTFS
IQAndreas 2014年

3
@IQAndreas不,Windows使用。和..的方式与Unix 大致相同(superuser.com/a/571364/330318)。(还有很多其他特殊名称: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

Answers:


25

.. 并不特殊,只是它已经存在。

在Unix,Dos和MS-Windows上,每个目录都有一个目录.,该目录可以链接回自身,还..可以链接到其父目录(如果是根目录,则为self)。

如果...特殊,则仅是因为您无法删除它们(实际上,您可以删除包含它们的目录)。

因此,您不能命名任何(其他)文件...

然而,你可以创建文件...\.. (注意有后的空格..或其他任何名称你喜欢在你的目录清单,但你很难看到在这里,否则容易); 该唯一保留的字符是/(警告-先进的细节:和NULL,NULL是一个特殊字符,不能用于任何东西,除了纪念的东西结尾,有时作为分隔符)。.没有特殊含义:不需要文件名,内核或外壳程序,不需要转义。实际上,如果文件名以a开头,.那么它是特殊的,该文件通常是隐藏的,但仍然不需要转义。

在旁边

这个隐藏文件的行为是约在早期实施的ls作者想躲,其中...,所以他们写的代码隐藏开始用的任何文件.。其他用户注意到此错误/功能,并从.希望隐藏文件的位置开始创建文件。

关联问题的说明

在您链接到发问者的问题中,尝试将文件移动到父目录,..但最终重命名为...,默认情况下隐藏以点开头的文件,这就是为什么找不到该文件的原因。

当使用形式的MV mv a b

  • 如果您移至.它,实际上是一个空操作,但mv会将其视为错误。
  • 如果移至..该位置,会将文件移至父目录。

1
你是什么意思If you move to . it is effectively a no operation?这不是“禁止操作”,如果在A和B相同的情况下尝试将文件从A移到B,则会出现错误。对该错误的更实际证明是mv foo ../some_dir/foomv foo some_subdir/../foo
布兰丁

7
对于“字符”的某些定义,NUL(0x00)也被限制在文件名和目录名中使用。
2014年

1
保留字符(即/NUL)和保留名(即...)之间的区别可以变得更加清晰。还值得指出.的是,名称的开头仅在应用程序层具有特殊含义,而在内核或系统调用API中则没有特殊含义。
kasperd 2014年

我认为您的空间迷路了。
nyuszika7h 2014年

1
..而且. 特别:您不能移动或删除它们。但是在将文件移到它们时它们并不特殊。
reinierpost 2014年

52

您无法将文件重命名为,.或者..因为所有目录已经包含这两个名称的条目,所以无法重命名。(这些条目指向目录,您不能将文件重命名为目录。)

mv 检测目标为现有目录的情况,并将其解释为将文件移至该目录的请求(使用其当前名称)。

反斜杠与此无关,因为.它不是shell元字符。 \.与... .相同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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.