硬链接算作普通文件吗?

Mr.*_*esh 21 bash hard-link shell-script files

我想知道是否有办法注册这个,但由于大多数现代搜索引擎不能很好地处理长度超过 5 个单词的短语,我需要一些帮助。

我想知道这一点,因为我正在制作一个 bash 脚本,它必须将文件注册为某些类型并做出相应的决定。这在技术上对我的项目并不重要,但我很好奇。

另外,如果它们被认为是常规文件,那么有没有办法检查这些文件是否硬链接而无需解析ls -i?有没有办法在不使用find -i命令的情况下检查某个任意文件 X 是否硬链接到某个其他任意文件 Y ?

seu*_*mac 39

在 Unix 风格的系统中,表示文件系统对象的数据结构(换句话说,关于文件的数据)存储在所谓的“inode”中。

文件名只是指向该 inode 的链接,称为“硬链接”。给定文件的名字与任何后续链接之间没有区别。所以答案是“是”:硬链接是一个普通文件,事实上,一个普通文件是一个硬链接。

ls命令将显示文件有多少硬链接。

例如:

seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt 
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt
Run Code Online (Sandbox Code Playgroud)

在这里,我们创建了一个名为/tmp/hello.txt. 在1从输出ls -l表明,有1个硬盘链接到本文件。这个硬链接就是文件名本身/tmp/hello.txt

如果我们现在创建另一个指向此文件的硬链接:

seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt
Run Code Online (Sandbox Code Playgroud)

您现在可以看到两个文件名都表明有 2 个指向该文件的硬链接。这些都不是“正确的”文件名,它们都同样有效。我们可以看到它们都指向同一个 inode(在本例中为 5374043):

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt
Run Code Online (Sandbox Code Playgroud)

有一个常见的误解,认为这对于目录是不同的。我听说有人说ls目录返回的链接数是子目录的数量,包括...哪个是不正确的。或者,至少,虽然它会给你正确的数字,但出于错误的原因它是正确的!

如果我们创建一个目录并执行 als -ld我们得到:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir
Run Code Online (Sandbox Code Playgroud)

这表明该目录有 2 个硬链接。这些是:

/tmp/testdir
/tmp/testdir/.
Run Code Online (Sandbox Code Playgroud)

请注意,/tmp/testdir/..不是该目录的链接,这是一个链接/tmp。这告诉您为什么“子目录数量”有效。当我们创建一个新的子目录时:

seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct  4 13:24 /tmp/testdir
Run Code Online (Sandbox Code Playgroud)

您现在可以看到有 3 个指向/tmp/testdir目录的硬链接。这些是:

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..
Run Code Online (Sandbox Code Playgroud)

因此,每个新的子目录都会将链接数增加 1,因为..它包含的条目。