하드 링크 수를 포함하여 파일 인쇄

하드 링크 수를 포함하여 파일 인쇄

다음 명령을 사용하여 디렉토리에 있는 파일에 대한 하드 링크 수를 인쇄할 수 있지만 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

위에서 볼 수 있듯이 fileinode를 가리킵니다 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다음과 같은 내용이 표시됩니다.filecat

$ 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

관련 정보