硬链接算作普通文件吗?


21

我想知道是否有一种方法可以注册该单词,但是由于大多数现代搜索引擎无法使用长度超过5个单词的短语,因此在此方面我需要一些帮助。

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

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


5
通过硬链接,“ X”实际上并没有链接到“ Y”。“ X”和“ Y”是同一文件。
jordanm

6
目录中的所有“常规文件”都是硬链接。一些这样的文件有多个。
安德鲁·亨利

@AndrewHenle Wow,好点。那正是我一直在寻找的东西,所以谢谢。
Minty Fresh先生,2015年

2
@ Mr.MintyFresh特别是,“原始”和“链接”之间没有区别,就像符号链接一样。
8

Answers:


38

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

文件名只是指向该索引节点的链接,被称为“硬链接”。给定文件的名字与任何后续链接之间没有区别。因此答案是“是”:硬链接是常规文件,实际上,常规文件是硬链接。

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

在这里,我们创建了一个名为的文件/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

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

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt

有一个普遍的误解,认为目录是不同的。我听到人们说,通过返回的链接数量ls为目录的子目录的数目,包括...这是不正确。或者,至少,尽管它会为您提供正确的数字,但由于错误的原因,这是对的!

如果我们创建目录并执行一个操作,ls -ld则会得到:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir

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

/tmp/testdir
/tmp/testdir/.

请注意,/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

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

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..

因此,每个新的子目录都会由于..其包含的条目而将链接数增加一。


我了解元数据,索引节点和硬链接的工作方式。我只需要澄清一下是否将硬链接文件算作常规文件。这仅显示出我的答案是“是”,这是因为专用于此的列隐含了这是所有文件固有的。很抱歉,但是我将不得不对此投票:(
Minty Fresh先生,2015年

很好,我相信这对其他人来说将是有用的信息。
seumasmac

使用dotglob硬链接系统进行有趣的编辑,我从不知道它能做到这一点。
Minty Fresh先生,2015年

我澄清了硬链接==常规文件段落。
seumasmac

1
特别像这样的句子:“这两个都不是'适当的'文件名,它们都同样有效。” 这是理解硬链接的关键要素。写得很好。
2015年

4

硬链接算作普通文件吗?

硬链接算作链接的对象。您可以链接到同一文件系统上的任何内容。

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

每个硬链接都是等效的,只要所有对象之间都存在任何(编辑:非符号)链接(甚至是一个打开的文件描述符,对此我都会感到尴尬),底层对象就会始终存在。

系统将对目录链接强制执行规则,您将获得一个指向目录的命名链接,并且系统会自动添加其嵌入式.链接和任何子目录的..链接(请注意,.在上面的ls中有两个链接),但这是对某些模块的显式检查承诺诺言的系统特权用户承诺不会进行循环,可以自己添加新链接。文件系统不在乎,它可以表示任意目录图,但没有人愿意处理它们。

有(许多非Unix)文件系统不能以这种方式工作,包括一些将它们提供的文件系统称为“硬链接”的文件系统。如果我没记错的话,OS X在HFS +上已经有了等同的功能(它本身没有),我不知道它在多大程度上忠实地保留了语义。


无论如何,./tsock实际上是做什么的?
mikeserv

@mikeserv这是上面的套接字程序,它只是在当前目录中删除了一个名为“ socket”的套接字链接。
jthill,2015年

好的,但是也许我应该更清楚我对套接字的了解。我想我对链接的理解足够好,所以它给同一个套接字一个新名称,对吗?对套接字或任何东西没有任何特殊意义,是吗?对我的无知感到抱歉。
mikeserv

1
@mikeserv套接字是纯运行时实体。 socket()创建一个实际的套接字,bind()为其指定一个特定的名称,connect()将您连接到某些命名的套接字。不同种类的插座使用不同种类的名称,例如互联网插座使用的互联网地址,但他们都有着共同的API(包括read()write(),这让我伤心,你不能open()一个文件系统插座并有OS或libc的做socket()connect()你) 。 man 7 socket拥有更多功能,所有网络协议的确使人烦躁不安。
jthill 2015年

1
@mikeserv看,我可以在美好的一天拼写pty和pts,甚至ptmx,但是仅此而已。:-)至少5,0节点在我能找到的任何地方都有效,这是control-tty设备类型。我只有ls -l / dev / tty才知道,我猜在那里很幸运。
jthill,2015年
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.