등록 방법이 있는지 궁금하지만 대부분의 최신 검색 엔진은 길이가 약 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 + (기본적으로는 포함되어 있지 않음)와 동등한 기능을 사용했습니다.