如果我疯了,我该如何将文件重命名为..
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