하드 링크는 일반 파일로 간주됩니까?

하드 링크는 일반 파일로 간주됩니까?

등록할 수 있는 방법이 없을까 궁금했는데, 대부분의 최신 검색 엔진은 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.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개 있음을 나타냅니다. 이들 중 어느 것도 "올바른" 파일 이름이 아니며 둘 다 동일하게 유효합니다. 둘 다 동일한 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에는 두 개의 링크가 있음에 유의하십시오). 이러한 수정된 명시적 검사는 권한이 있는 사용자가 스스로 새 링크를 추가할 수 있는 시스템에서 반복되지 않을 것을 약속합니다. 파일 시스템은 상관하지 않습니다. 임의의 디렉터리 그래프를 매우 잘 나타낼 수 있지만 누구도 이를 처리하고 싶어하지 않습니다.

"하드 링크"로 제공되는 대안을 참조하는 일부를 포함하여 이러한 방식으로 작동하지 않는 (UNIX가 아닌 많은) 파일 시스템이 있습니다. 내가 올바르게 기억한다면 OS X는 HFS+에 상응하는 기능을 함께 엮어 놓았으며(기본적으로는 없음) 여기에서 의미론을 얼마나 충실하게 유지하는지 모르겠습니다.

관련 정보