a_1부터 a_n까지 n개의 파일이 서로 하드 링크되어 있다고 가정합니다. 게다가 b_1부터 b_m까지 m개의 파일이 있는데, 서로 하드 링크되어 있습니다(그러나 a_* 파일에는 하드 링크되지 않습니다).
b_* 하드 링크를 a_* 파일로 지정하는 가장 현명한 방법은 무엇입니까? b_1을 반복하고 각각을 a_1로 지정하시겠습니까? 아니면 전체 그룹을 함께 바꾸는 방법이 있나요?
b 파일 중 하나를 알고 있으면 어떻게 모든 b_* 파일을 찾을 수 있습니까? 즉, 특정 파일에 하드 링크된 다른 모든 파일을 찾는 방법은 무엇입니까? 전체 파일 시스템을 스캔하는 대신 Python을 사용하는 것이 더 낫습니까?
답변1
아니요, 함께 변경할 수는 없습니다. 그 이유는 관련된 건설에 있습니다. 논의를 용이하게 하기 위해 문서는 세 부분으로 나누어져 있습니다.
- 파일 이름
- 인덱스 노드
- 파일 데이터
포인터가 실행되는 곳 file names --> inode --> file data
. inode에서 파일 이름을 가져오는 백 포인터가 없습니다.
inode를 가리키는 파일 이름을 찾는 유일한 방법은 전체 파일 시스템을 검색하여 각 파일 이름을 확인하는 것입니다(권장하지 않음).
그렇습니다. 각 하드 링크를 하나씩 변경해야 합니다.
중요한 메모입니다. 하드 링크를 찾을 수는 없지만 얼마나 많은 링크가 있는지 알 수 있습니다. a_* 또는 b_*에 더 많은 하드 링크가 있는지 확인하는 것이 좋습니다. 이렇게 하면 링크가 적은 파일을 선택하여 이미 하드 링크가 가장 많은 파일을 삭제하고 추가할 수 있습니다.
ext3에는 파일당 최대 65,000개의 하드 링크가 있다는 점을 명심하세요. 어제 이 문제가 발생했기 때문에 이것을 언급합니다.
답변2
파일 이름은 inode에 대한 단방향 포인터입니다. 일반적인 Unix 파일 시스템 구조에서는 포인터를 얻을 수 있는 직접적인 방법이 없습니다.
즉, 원하는 것을 수행하는 유일한 방법은 찾는 것입니다.두번째파일링, 링크 해제 및 새 링크 생성ㅏ그들의 자리에. 한 번에 모든 것을 할 수는 없습니다.
또한 파일에 대한 하드 링크를 직접 찾을 수 없으므로 전체 파일 시스템을 검사해야 합니다. GNU 및 FreeBSD 버전(적어도)에는 inode를 기반으로 파일(이름)을 찾는 데 사용할 수 있는 테스트된 버전이 find
있습니다 .-inum
-samefile
b
GNU 찾기를 사용하면 하드 링크된 파일 ( b
자체 포함)을 찾고 다음 링크로 바꾸는 것과 유사한 작업을 수행할 수 있습니다 a
.
find -samefile b -exec sh -c 'ln -f a "$1"' sh {} \;