我在教科书中读到 Unix/Linux 不允许硬链接到目录,但允许软链接。是不是因为,当我们有循环,如果我们创建硬链接,一段时间后我们删除原始文件,它会指向一些垃圾值?
如果循环是不允许硬链接的唯一原因,那么为什么允许软链接到目录?
该表达式.*
由 bash 扩展以包括当前和父目录:
$ ls -la
total 2600
drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 ..
-rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo
$ echo .*
. ..
Run Code Online (Sandbox Code Playgroud)
如果我rm -rf .*
使用 GNU bash 在我的 Debian 上运行,version 4.2.36(1)-release
并且rm
从rm (GNU coreutils) 8.13
,我会收到以下消息:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
Run Code Online (Sandbox Code Playgroud)
这是 GNU 的东西还是 POSIX?是否有任何 …
我已经看到很多解释为什么基于 Unix 的操作系统中空目录的链接数是 2 而不是 1。他们都说这是因为 '.' 目录,每个目录都指向它自己。我明白为什么会有一些“。”的概念。对于指定相对路径很有用,但是在文件系统级别实现它有什么好处?为什么不让 shell 或采用路径的系统调用知道如何解释它呢?
'..' 是一个真正的链接对我来说更有意义——文件系统需要存储一个指向父目录的指针才能导航到它。但我不明白为什么“。” 成为一个真正的链接是必要的。它似乎也导致了实现中的一个丑陋的特殊情况——你会认为你只能释放链接数小于 1 的 inode 使用的空间,但如果它们是目录,你实际上需要检查一个链接数小于 2。为什么不一致?
在 Linux 上,当您创建文件夹时,它会自动创建两个指向相应 inode 的硬链接。一个是您要求创建的文件夹,另一个是.
此文件夹的特殊文件夹。
例子:
$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x 2 fantattitude staff 68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x 2 fantattitude staff 68 18 oct 16:52 .
124593716 drwxr-xr-x 3 fantattitude staff 102 18 oct 16:52 ..
Run Code Online (Sandbox Code Playgroud)
如您所见,folder
和.
的内部folder
具有相同的 inode 编号(显示为-i
选项)。
有没有办法删除这个特殊的.
硬链接?
它仅用于实验和好奇心。
另外我想答案也适用于..
特殊文件。
我试图调查rm
男人,但找不到任何方法来做到这一点。当我尝试删除.
所有内容时,我得到的是:
R M: ”。” …
对 /home/user/ 目录中的下一个简单文件结构进行映像:
/home/user
|--dir0
|--dir1
|--file1
Run Code Online (Sandbox Code Playgroud)
我当前的目录是“dir1”,我使用以下命令从内部删除目录:
rm -r ../dir1
Run Code Online (Sandbox Code Playgroud)
之后(并且在终端上没有出现任何错误),工作目录仍然相同,并且在使用命令pwd 时,输出为:
user@ubuntu:~/dir0/dir1$ pwd
/home/user/dir0/dir1
user@ubuntu:~/dir0/dir1$
Run Code Online (Sandbox Code Playgroud)
如果已经从文件系统中删除了工作目录,为什么操作系统会返回工作目录是“dir1”?
在第一个终端A中,我创建一个目录,进入该目录,并创建一个文件:
$ mkdir test
$ cd test
$ touch file1.txt
$ ls
file1.txt
Run Code Online (Sandbox Code Playgroud)
然后在另一个终端 B 中,我删除了目录:
$ rm -r test
$ mkdir test
$ cd test
$ touch file2.txt
Run Code Online (Sandbox Code Playgroud)
再回到终端 A(不做任何操作cd
),我尝试列出文件:
$ ls
Run Code Online (Sandbox Code Playgroud)
ls
没有看到任何东西,也没有抱怨。
后台会发生什么?怎么ls
没看出问题?是否有标准的、便携的和/或推荐的方法来找出终端 A 中的某些问题?
pwd
只是打印看似正确的目录名称。touch file3.txt
说没有这样的文件或目录,这是没有帮助的。只bash -c "pwd"
给出了两条很长的错误行,以某种方式表明出了什么问题,但并没有真正的描述性,而且我不确定不同系统之间的可移植性(我在 Ubuntu 16.04 上)。cd .. && cd test
解决了问题,但并没有真正解释发生了什么。