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


21

등록 방법이 있는지 궁금하지만 대부분의 최신 검색 엔진은 길이가 약 5 단어가 넘는 문구와 잘 작동하지 않으므로 이에 대한 도움이 필요합니다.

파일을 특정 유형으로 등록하고 그에 따라 결정 해야하는 bash 스크립트를 만들고 있기 때문에 이것이 궁금합니다. 이것은 기술적으로 내 프로젝트에 중요하지 않지만 궁금합니다.

또한 파일이 일반 파일로 간주되면 파싱하지 않고도 이러한 파일이 하드 링크되어 있는지 확인할 수 ls -i있습니까? 그리고 find -i명령 을 사용하지 않고 임의의 파일 X가 다른 임의의 파일 Y에 하드 링크되어 있는지 확인하는 방법이 있습니까?


5
하드 링크를 사용하면 "X"는 실제로 "Y"에 연결되지 않습니다. "X"와 "Y"는 동일한 파일입니다.
jordanm

6
디렉토리의 모든 "일반 파일"은 하드 링크입니다. 이러한 일부 파일에는 둘 이상의 파일이 있습니다.
Andrew Henle

@AndrewHenle 와우, 좋은 지적. 그것은 내가 찾던 것과 똑같습니다. 감사합니다.
Mr. Minty Fresh

2
@ Mr.MintyFresh 특히, 심볼릭 링크와 같이 "원본"과 "링크"사이에는 차이가 없습니다.
Random832

답변:


38

유닉스 스타일 시스템에서, 파일 시스템 객체 (즉, 파일 에 관한 데이터)를 나타내는 데이터 구조 는 소위 "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/..

따라서 모든 새 하위 디렉토리 ..에는 포함 된 항목으로 인해 링크 수가 하나씩 증가합니다 .


메타 데이터, inode 및 하드 링크 작동 방식을 이해합니다. 하드 링크 된 파일이 일반 파일로 계산되었는지 명확히해야했습니다. 이것은 전용 열로 인해 응답이 '예'라는 것을 보여줍니다. 이는 모든 파일에 고유하다는 것을 암시 적으로 나타냅니다. 죄송 합니다만,이 부분을 하향 조정해야합니다 :(
Mr. Minty Fresh

괜찮습니다. 다른 사람에게 유용한 정보가 될 것이라고 확신합니다.
seumasmac

닷 글로브 하드 링크 시스템을 이용한 재미있는 편집으로, 나는 이것이 그렇게하는 것을 몰랐다.
Mr. Minty Fresh

하드 링크 == 일반 파일 단락을 명확히했습니다.
seumasmac

1
특히 다음과 같은 문장과 같습니다. "이 둘 중 어느 것도 '적절한'파일 이름이 아니며 둘 다 동일하게 유효합니다." 그것은 하드 링크를 이해하는 데 중요한 요소입니다. 아주 훌륭하게 작성되었습니다.
와일드 카드

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에는 두 개의 링크가 있음에 유의하십시오). 루프를 만들지 않겠다고 약속하는 시스템 특권 사용자는 새로운 링크를 직접 추가 할 수 있습니다. 파일 시스템은 신경 쓰지 않고 임의의 디렉토리 그래프를 잘 나타낼 수 있지만 아무도 다루기를 원하지 않습니다.

대체 "하드 링크"로 제공되는 것을 포함하여 이러한 방식으로 작동하지 않는 많은 비 유닉스 파일 시스템이 있습니다. OS X은 올바르게 기억한다면 HFS + (기본적으로는 포함되어 있지 않음)와 동등한 기능을 사용했습니다.


./tsock어쨌든 실제로 무엇을 합니까?
mikeserv

@mikeserv 위의 소켓 만들기 프로그램으로, 현재 디렉토리에 "socket"이라는 소켓 링크를 드롭합니다.
jthill

알았지 만 어쩌면 소켓에 대해 아는 것이 거의 없다는 것을 분명히해야했을 것입니다. 나는 충분히 링크를 이해한다고 생각하므로 동일한 소켓에 새로운 이름을 부여합니다. 소켓이나 다른 것에는 특별한 의미가 없습니다. 내 무지에 대해 죄송합니다.
mikeserv

1
@mikeserv 소켓은 순전히 런타임 엔터티입니다. socket()실제 소켓을 작성하고 bind()특정 이름을 지정하고 connect()작성한 소켓을 이름 지정된 소켓에 연결합니다. 소켓의 다른 종류는 이름의 다른 종류를 사용, 예를 들어, 인터넷 소켓은 인터넷 주소를 사용하지만, 그들은 모두 공유하는 공통의 API (을 포함 read()하고 write(), 당신이 할 수없는 나를 슬프게 open()파일 시스템 소켓이 OS를하거나 할 LIBC socket()connect()당신을 위해) . man 7 socket더 많은 것은, 모든 네트워킹 프로토콜이 fidgety 맨 페이지를 만드는 것입니다.
jthill

1
@ mikeserv 참조, 나는 pty와 pt를 철자 할 수 있으며, 아마도 좋은 날에는 ptmx 일 수도 있지만 그게 전부입니다. :-) 적어도 5,0 노드는 내가 찾을 수있는 모든 곳에서 작동합니다. 제어 장치 유형입니다. 나는 ls -l / dev / tty로 그것을 얻었습니다.
jthill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.