다음 명령을 사용하여 디렉토리에 있는 파일에 대한 하드 링크 수를 인쇄할 수 있지만 find . type f -printf "%f %n\n"
원본 파일에 대한 하드 링크만 인쇄하지는 않습니다.
예: file1은 원본 파일입니다. hardlink1은 원본 파일1에 대한 하드 링크입니다.
이 코드를 사용하면 다음이 인쇄됩니다.
file1 2 hardlink1 2
이 문제는 find
. 원본 파일을 인쇄하고 싶습니다.
답변1
하드 링크가 어떻게 작동하는지 오해하고 있습니다. 원본이 없습니다.모두파일이 하드 링크되어 있습니다.인덱스 노드. 따라서 하드 링크는 실제로 파일에 연결되지 않고 inode에 연결됩니다.
이 점을 설명하기 위해 다음 문서를 고려하십시오.
$ touch file
$ ls -li file
3282140 -rw-r--r-- 1 terdon terdon 0 May 3 16:27 file
위에서 볼 수 있듯이 file
inode를 가리킵니다 3282140
. 이제 이에 대한 소프트 링크를 생성하면 다음과 같습니다.
$ ln -s file softlink
$ ls -li
3282140 -rw-r--r-- 1 terdon terdon 0 May 3 16:27 file
3282141 lrwxrwxrwx 1 terdon terdon 4 May 3 16:29 softlink -> file
소프트 링크는 을 가리키지 file
만 링크 자체(또는 파일 시스템 개체, 또 다른 "파일")에는 다른 inode( 3282141
)가 있습니다. 그러나 하드 링크를 생성하면 동일한 인덱스 노드를 공유하게 됩니다.
$ ln file hardlink
$ ls -li
total 0
3282140 -rw-r--r-- 2 terdon terdon 0 May 3 16:27 file
3282140 -rw-r--r-- 2 terdon terdon 0 May 3 16:27 hardlink
3282141 lrwxrwxrwx 1 terdon terdon 4 May 3 16:29 softlink -> file
따라서 이제 여기에 텍스트를 추가하면 hardlink
그 자체에 텍스트를 추가하는 것과 정확히 같습니다 file
.
$ echo "foo" > hardlink
$ cat hardlink
foo
$ cat file
foo
그리고 softlink
포인팅 으로 인해 file
다음과 같은 내용이 표시됩니다.file
cat
$ cat softlink
foo
file
다음에 텍스트를 추가해도 hardlink
같은 일이 발생합니다 file
.
$ echo bar >> file
$ cat hardlink
foo
bar
이제 이를 제거하면 file
링크 softlink
가 끊어지지만 hardlink
영향을 받지 않습니다.
$ rm file
$ ls -li
total 4
3282140 -rw-r--r-- 1 terdon terdon 8 May 3 16:33 hardlink
3282141 lrwxrwxrwx 1 terdon terdon 4 May 3 16:29 softlink -> file
$ cat softlink
cat: softlink: No such file or directory
링크의 대상이 제거되었기 때문에 소프트 링크가 끊어졌습니다. 그러나 하드 링크는 동일한 inode를 가리키기 때문에 여전히 존재합니다.
$ cat hardlink
foo
bar
이 모든 것은 소프트 링크와 달리 실제로 파일을 가리키도록 생성되지 않았기 때문에 하드 링크와 그것이 가리키도록 생성된 파일을 구별할 방법이 없다는 것을 의미합니다. 모든 파일은 파일 시스템 inode에 대한 하드 링크입니다. 실제로 파일을 삭제하면 인덱스 노드에 대한 링크만 제거됩니다. 실제로 데이터가 삭제되지는 않습니다. 시스템은 각 inode에 대한 링크 수를 추적하고, 링크 수가 0이면 해당 inode는 쓰기 가능한 것으로 간주됩니다.
당신이 할 수 있는 일은 특정 inode를 가리키는 모든 링크를 찾아 하나만 빼고 모두 삭제하는 것입니다. 우리가 시작한 곳으로 돌아가면:
$ rm *
$ touch file
$ ln file hardlink
$ ls -l file hardlink
-rw-r--r-- 2 terdon terdon 0 May 3 16:39 file
-rw-r--r-- 2 terdon terdon 0 May 3 16:39 hardlink
^
|---- the number of links
의 출력에는 ls -l
인덱스 노드를 가리키는 링크 수가 포함됩니다. 따라서 출력을 반복하고(이것은 ls
구문 분석이 안전한 몇 안 되는 경우 중 하나임) 링크 번호가 1보다 큰 파일을 제거할 수 있습니다.
for file in *; do [ $(ls -l $file | cut -d' ' -f2) -gt 1 ] && rm "$file"; done
이렇게 하면 동일한 디렉토리에 있는 하드 링크 중 하나만 제외하고 모두 제거됩니다.
추가 자료:http://teaching.idalen.com/dat2330/04f/notes/links_and_inodes.html