ハードリンクは通常のファイルと見なされますか?

ハードリンクは通常のファイルと見なされますか?

登録する方法がないかと思っていましたが、ほとんどの最新の検索エンジンは5単語以上の構文をうまく処理できないため、助けが必要です。

ファイルを特定のタイプに登録し、それに応じて決定を下す必要があるbashスクリプトを作成しているので、これは不思議です。技術的には、これは私のプロジェクトにとって重要ではありませんが、疑問に思います。

また、通常のファイルと見なされる場合は、解析せずにファイルがハードリンクであるかどうかを確認する方法はありますかls -i?コマンドを使用せずに、ランダムファイルXが他のランダムファイルYにハードリンクされていることを確認する方法はありますかfind -i

答え1

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

ここではというファイルを作成しました/tmp/hello.txt1出力は、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つあることを示します。これらのどれも「正しい」ファイル名ではなく、両方とも同じように有効です。どちらも同じ inode (この場合は 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/..

したがって、各新しいサブディレクトリには、含まれているエントリのためにリンク数が1ずつ増えます..

答え2

ハードリンクは通常のファイルと見なされますか?

ハードリンクはリンクされたコンテンツと見なされます。同じファイルシステム内のすべての項目に接続できます。

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には2つのリンクがあります)注意してください)。これらの修正された明示的なチェックは、権限のあるユーザーが自分で新しいリンクを追加できるシステムでは繰り返されないことを約束します。ファイルシステムは関係ありません。任意のディレクトリグラフを非常によく表すことができますが、誰もこれを処理したくありません。

「ハードリンク」として提供される代替を参照する一部を含む、このように動作しない(UNIX以外の多くの)ファイルシステムがあります。私が正しく覚えているなら、OS XはHFS +に対応する機能を一緒にまとめて(基本的にはなし)、ここで意味論をどれほど忠実に保つかわかりません。

関連情報