등록할 수 있는 방법이 없을까 궁금했는데, 대부분의 최신 검색 엔진은 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+에 상응하는 기능을 함께 엮어 놓았으며(기본적으로는 없음) 여기에서 의미론을 얼마나 충실하게 유지하는지 모르겠습니다.