하드 링크는 일반 파일로 간주됩니까? 방법이 있는지 궁금하지만 대부분의

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

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

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



답변

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

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


답변

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

하드 링크는 링크 된 것으로 간주됩니다. 동일한 파일 시스템에있는 모든 것에 연결할 수 있습니다.

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 + (기본적으로는 포함되어 있지 않음)와 동등한 기능을 사용했습니다.