在旁边

在旁边

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

如果我疯了,我该如何将文件重命名为..or .?这样的文件名是否被允许?

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

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

答案1

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

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

反斜杠与此无关,因为.它不是 shell 元字符。 \..与 相同bash

答案2

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

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

如果...是特殊的,那只是因为您无法删除它们,或重命名它们(实际上您可以删除它们,只需删除包含它们的目录)。

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

但是,您可以创建文件...\.. (请注意 后面有一个空格..,但您在这里几乎看不到它,或者在目录列表中很容易看到它)或您喜欢的任何其他名称;这仅有的保留字符是/(警告 - 高级详细信息:和 null,null 是一个特殊字符,除了标记事物的结尾之外不用于任何其他用途,有时用作分隔符)。.没有特殊含义:不是文件名、内核或 shell,不需要转义。实际上,如果文件名以 a 开头,.那么它是特殊的,该文件通常被目录列表工具(例如 )隐藏ls,但仍然不需要转义。

在旁边

这种隐藏文件行为出现在ls作者想要隐藏的早期实现中...因此他们编写了代码来隐藏以..其他用户注意到了这个错误/功能,并开始创建从.他们想要隐藏文件的文件开始的文件。

链接问题的解释

在您链接到提问者的问题中,试图将文件移动到父目录..,但最终重命名为...,以点开头的文件默认是隐藏的,这就是为什么他们找不到它。

当在表单中使用 mv 时mv a b

  • 如果您移动到.它,实际上是一个 no 操作,但mv会将其视为错误。
  • 如果移动到..它会将文件移动到父目录。

答案3

问题是您正在将文件移动到目录中。这是允许失败的。

我要告诉你它曾经是怎样的。

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

相关内容