하드 링크가 생성 된 경우 어떤 파일이 원본인지 확인하는 방법


34

예를 들어 파일이 myold_file있습니다. 그런 다음 ln하드 링크를 만드는 데 사용 합니다 mylink.

ln myold_file mylink

그런 다음을 사용하더라도 ls -a오래된 것이 무엇인지 알 수 없습니다.

어쨌든 말할 것이 있습니까?


2
반대 질문 : 당신이한다면 ls > a; ln a b; rm a; ln b c, 어느 것이 다른 것보다 "보다 독창적입니까?" a사라졌다, 당신은 남아 b있고 c...
glglgl

2
당신은 무엇을 달성하려고합니까? 당신은 무엇을 달성하려고합니까? "원본"은 없습니다. 파일은 메타 데이터를 포함하는 inode와 데이터를 포함하는 블록 모음입니다. 디렉토리는 파일에 대한 링크를 포함 할 수 있으며이 링크는 파일 이름과 inode 번호입니다. 파일에 대한 링크를 얼마든지 만들 수 있습니다. 파일은 하나 이상의 링크를 가질 수 없습니다.
Johan

이 질문에 대한 답변에 대한 자세한 설명은 해당 질문에 대한 답변을 참조하십시오 .
Utku

답변:


93

문자 그대로 동일한 파일이므로 다른 경로로만 도달 할 수 없습니다. 첫 번째는 특별한 지위가 없습니다.


4
이것은 정답입니다. OP의 질문은 오해에 기초하고 있습니다.
Daniel Earwicker

8
@Adnan 사실, 아니오 : 두 개의 하드 링크는 동일한 파일입니다. 그것들은 다른 디렉토리 항목입니다. Jenny D의 용어가 맞습니다.
Gilles 'SO- 악의를 멈추십시오

1
@Gilles 나는 그것이 어떻게 정확한지 알지 못한다. 두 개의 하드 링크는 두 개의 파일 이 아닙니다 . 하드 링크는 파일이 아닙니다. 그들은 지적 따라서, 링크 (디스크의 물리적 위치이다) 같은 파일을. "두 개의 하드 링크는 문자 그대로 동일한 파일" 이라고 말하는 것이 잘못되었습니다.
Adi

1
@JennyD 그리고 그것은 "하드 링크"가 사용되는 것을 듣는 유일한 방법입니다. inode에 대한 파일 시스템 포인터 글쎄, 우리 모두 틀렸다고 생각한다. 나는 이것이 무의미한 주장을 그만 둘 것이다. 당신은 대답이 나에게 맞는 것 같습니다, 당신은 나에게서 +1을 가지고 있으며, 나는 그것을 그것에 남겨 둘 것입니다.
Adi

5
하드 링크가 파일이라고 말하는 것은 기술적으로 잘못된 여러 범주의 항목을 비교하는 것입니다. 그러나 .bashrc"상대 경로 .bashrc는 다음을 포함하는 파일을 나타냅니다 ..."라는 의미에서 일반적으로 " 포함하는 파일입니다 ..." 라고 말하면 이는 카테고리의 일반적인 혼동이며, 참조 할 때마다이를 이해해야합니다. 파일이 "인"경로 또는 디렉토리 항목, 파일이 참조하는 파일을 의미합니다. 이를 이해하면 두 개의 하드 링크가 동일한 파일이 될 수 있습니다. 공식 언어를지지하는 그러한 관습을 거부 할 수는 없다. 두 입장 모두 자리가있다 :-)
Steve Jessop

16

직접적이고 깨끗하고 신뢰할 수있는 방법은 없습니다. 그러나 적절한 상황에서 이것이 가능할 수 있습니다 (또는 적어도 가능할 수도 있습니다). 문제는 두 개의 하드 링크가 있지만 하나의 파일 만 있다는 것입니다. 변경, 수정 및 (아마도) 작성 시간은 파일 (노드)에 대해서만 저장되지만 디렉토리 항목 (하드 링크)에 대해서는 저장되지 않습니다. 따라서 원하는 정보는 파일과 관련이없는 작업으로 쉽게 파괴 할 수있는 보조 효과에서만 가져올 수 있습니다. 그리고 당신은 그것이 파괴되었는지 볼 수 없습니다. 정확하게 알고 있으면 운영 환경에서만 알 수 있습니다.

하드 링크 작성은 링크가 포함 된 디렉토리에 대한 쓰기 조작입니다. 따라서 디렉토리의을 업데이트합니다 mtime. 그래서 경우

  1. 링크는 다른 디렉토리에 있습니다

  2. 그리고 두 번째 하드 링크가 작성된 후 이러한 디렉토리 중 어느 것도 변경되지 않았 음을 알 수 있습니다 (파일 추가, 삭제, 이름 변경 또는 파일 메타 데이터 변경). 단순히 mtime디렉토리 의 s를 비교할 수 있습니다 .

특별한 경우 : 디렉토리 중 하나에 mtime파일 이전 (노드) mtime이 있고 파일이 작성된 후 짧은 시간 이후에 파일이 작성되지 않았 음을 확신 할 수있는 경우이 디렉토리의 링크는 이전 디렉토리입니다.

링크가 동일한 디렉토리에 있으면 (질문과 같은 경우) 악화됩니다. 그런 다음 사용할 수 있습니다

ls -lU

항목이 작성된 순서의 인상을 얻기 위해. 디렉토리 목록 중간에 새 항목이 작성되도록 항목을 삭제할 수 있으므로 올바른 순서 일 필요는 없습니다. Gilles가 지적했듯이 최신 파일 시스템에서는 전혀 작동하지 않습니다.


2
파일 시스템 저널에서 selinux, 감사 추적 또는 스파이에 대한 언급이 없습니까 ??? smirk 감사 추적 없이는 알 수있는 방법이 없습니다 . 다른 어떤 것도 계산 된 추측입니다
Ricky Beam

1
@mikeserv 다른 사람들에게 이런 식으로 가르치고 싶다면 적어도 정확하게 인용하는 법을 배워야합니다. 그것은 않습니다 하지 질문에 "어떤 파일"을 말한다. 그리고 그것이 되었더라도 이것은 단지 말로 표현하는 문제 일 뿐이며 질문을 이해하기 위해 뇌를 던지면 실제로 그것이 무엇에 관한 것인지 쉽게 드러 낼 것입니다.
Hauke ​​Laging

4
상황이 옳다면 (드문 경우) 디렉토리 mtime 트릭이 작동합니다. 그러나 당신이 그것을 제시하는 방식에 따라 때때로 반대 결론에 도달하게 될 것입니다. mtime 디렉토리는 파일의 ctime과 같은 경우에만 가치있는 표시입니다. 그러나 ls -lU트릭은 최신 파일 시스템 (ext4, btrfs, zfs)에서는 작동하지 않으며 항목이 생성 순서대로 표시되지 않습니다.
Gilles 'SO- 악의를 멈추십시오

2
@ mikeserv-OP의 질문은 오해에 근거합니다. 그들이 그랬다면 rm myold_file그 다음 mylink은 동일한 기본 아이 노드를 참조 동등하게 좋은 항목이기 때문에 아직 완벽하게 존재 일 것이다. 둘 다 삭제 된 경우에만 시스템이 inode를 삭제할 수 있습니다. 동일한 파일을 참조하는 두 개의 파일 시스템 항목을 작성하기 위해 하드 링크를 사용한 후에는 동일합니다. (여기서 "file"은 "디렉토리가 아닌 파일의 데이터를 보유하는 inode를 의미합니다.) 참조 : en.wikipedia.org/wiki/Inode
Daniel Earwicker

1
-1, 테이블을 업데이트 할 때 일부 파일 시스템에서 디렉토리가 어떻게 변경되는지에 대한 정보가 있지만이 대답은 "원본 파일"이 여러 하드 링크의 경우 속성이 아니라는 질문에 존재하는 오해를 해결하지 못하기 때문에 단일 inode에. 이런 의미에서 일화가 흥미롭지 만이 질문에 착륙하는 대부분의 사람들이 하드 링크의 기본 개념에 대해 배우는 것은 아닙니다. 이 문제는 "직접적인 깨끗한 방법"이 부족하지 않으며 , 처음 에는 "그것"이 없다는 문제입니다 .
Caleb

10

디렉토리의 마지막 수정 시간에 의존하고 해당 디렉토리가 변경되는 방법과시기를 모르는 경우 mtime을 사용하면 시간의 일부가 잘못 될 수 있습니다. 여기서 문제는 파일이 디렉토리 항목이 아닌 inode로 파일 시스템에 표시된다는 것입니다. 디렉토리 항목 (파일 이름)은 파일이 아니라 inode를 가리 킵니다.

어떤 디렉토리 항목이 더 오래된 지 알아야하는 이유와 그 사실을 피할 필요가없는 방법에 대해 살펴보면 좋을 것 같습니다.


8

나는이 질문이 하드 링크가 실제로 무엇인지에 대해 (합리적으로) 잘못 인도되었다고 생각합니다. 그러나 가장 정확한 대답은 '둘 다' 입니다.

유닉스 파일 시스템은 일반적으로 실제 파일 내용과 데이터를 i- 노드에 저장합니다. 이것들은 경로가 없으며, 경로는 i- 노드와 다 대일 관계가 있습니다. Bob과 Joe라는 두 이름을 가진 사람을 비유하십시오. 밥이 조보다 나이가 많거나 그 반대라고 말할 수 없었습니다. 그들은 같은 사람의 이름 일뿐입니다.

'원본'파일의 개념과 새로운 파일의 개념을 유지하려면 대신 심볼릭 링크를 찾고있을 것입니다. 이것은 별명 일뿐입니다. 운영 체제에 대한 명령으로 마치 하나의 경로로 작동하는 것처럼 지시합니다. 파일 구조를 변경하지 않고 다른 파일로 변경했습니다. ( "ln -s 파일 링크"를 사용하여 만들 수 있습니다.


Bob / Joe는 그의 나이에 대해 정말로 민감해질 수 있습니다 ... 하드 / 소프트 링크 비교는 좋은 것입니다. 특히 하드 링크는 디렉토리 파일에 항목을 추가 할 것입니다. inode-그러나 소프트 링크는 자체적으로 파일이므로 고유 한 inode가 할당됩니다. 여전히 두 경우 모두 수정 시간은 링크 된 파일에만 관련이 있습니다. 모든 중요 링크에 대해 수행 할 수있는 유일한 수정은 작성 / 삭제뿐이기 때문입니다.
mikeserv

2

위의 여러 다른 사람들의 대답의 핵심은 모든 파일 이름이 파일에 대한 하드 링크라는 것입니다. 실제 원본은 없으며 첫 번째 원본 일 수도 있습니다.

디렉토리를 파일 이름과 inode- 번호를 나열하는 테이블로 생각하십시오.

첫 번째 링크를 포함한 모든 하드 링크는 "파일 이름"을 inode 번호에 할당하는 디렉토리의 항목이므로 해당 이름으로 파일에 액세스 할 수 있습니다.

이 파일은 디스크에있는 블록의 모음으로, inode에 저장된 메타 데이터로 관리 및 추적됩니다. 파일에는 하나의 inode 번호가 있습니다.

파일 이름을 통해 파일 데이터에 액세스하는 것은 3 단계 프로세스입니다. 파일 이름은 디렉토리에서 조회되어 inode 번호를 얻습니다. 그런 다음 inode는 데이터를 포함하는 관련 디스크 블록을 찾기 위해 참조됩니다. 그런 다음 해당 블록을 읽고 씁니다.

따라서 기본적으로 이것의 전부는 다음과 같습니다. 첫 번째 ( "원본") 또는 이후에 생성 된 하드 링크를 사용하여 파일 내용에 액세스하는 것에는 전혀 차이가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.