ln은 유닉스 및 유닉스 계열 운영 체제(리눅스, macOS 등)에서 파일 시스템 내의 파일 또는 디렉터리 간에 '링크'를 생성하는 데 사용되는 명령줄 유틸리티입니다. 이 명령은 주로 파일이나 디렉터리에 대한 추가적인 참조 경로를 만들거나, 특정 위치에 다른 파일의 '바로가기'를 생성하는 목적으로 활용됩니다. ln 명령으로 생성할 수 있는 링크에는 크게 두 가지 유형이 있습니다: 하드 링크(hard link)와 심볼릭 링크(symbolic link, 또는 소프트 링크 soft link).
1. 하드 링크 (Hard Link)
하드 링크는 파일 시스템의 물리적 데이터(inode)에 대한 직접적인 참조입니다. 모든 파일은 적어도 하나의 하드 링크를 가지고 있으며, 파일 이름이 이 하드 링크 역할을 합니다. ln 명령으로 추가적인 하드 링크를 생성하면, 여러 개의 파일 이름이 동일한 inode를 가리키게 됩니다.
- 특징:
- 동일한 데이터: 모든 하드 링크는 동일한 파일 데이터를 공유합니다. 한 링크를 통해 파일을 수정하면 다른 모든 링크를 통해서도 수정된 내용이 반영됩니다.
- inode 공유: 하드 링크는 원본 파일과 동일한 inode 번호를 가집니다. 이는 파일 시스템 내에서 동일한 물리적 데이터 블록을 참조한다는 의미입니다.
- 파티션(파일 시스템) 제한: 하드 링크는 동일한 파일 시스템(파티션) 내에서만 생성할 수 있습니다. 다른 파티션에 있는 파일에는 하드 링크를 만들 수 없습니다.
- 디렉터리 링크 불가: 보안 및 파일 시스템 무결성 문제로 인해 디렉터리에는 하드 링크를 생성할 수 없습니다.
- 삭제: 하나의 하드 링크를 삭제해도 파일의 실제 데이터는 모든 하드 링크가 삭제될 때까지 유지됩니다. 즉, 파일의 참조 카운트가 0이 될 때까지 데이터는 삭제되지 않습니다.
- 생성 방법:
ln 대상_파일 링크_이름
2. 심볼릭 링크 (Symbolic Link / Soft Link)
심볼릭 링크는 특정 파일이나 디렉터리를 가리키는 특수한 종류의 파일입니다. 마치 윈도우의 '바로가기'와 유사하게 작동합니다. 심볼릭 링크 자체는 매우 작은 크기의 파일로, 그 내용에는 자신이 가리키는 대상 파일 또는 디렉터리의 경로가 기록되어 있습니다.
- 특징:
- 독립적인 inode: 심볼릭 링크는 원본 파일과 다른 별도의 inode를 가집니다.
- 경로 저장: 심볼릭 링크는 대상 파일의 경로를 저장하며, 대상 파일의 실제 데이터는 저장하지 않습니다.
- 파티션 제한 없음: 다른 파일 시스템(파티션)에 있는 파일이나 디렉터리에도 심볼릭 링크를 생성할 수 있습니다.
- 디렉터리 링크 가능: 디렉터리에도 심볼릭 링크를 생성할 수 있어, 긴 경로를 간략화하거나 접근성을 높이는 데 유용합니다.
- 대상 삭제 시 문제: 원본 파일이나 디렉터리가 삭제되면 심볼릭 링크는 '깨진 링크(broken link)' 또는 '댕글링 링크(dangling link)'가 되어 더 이상 유효한 대상을 가리키지 못하게 됩니다.
- 생성 방법:
ln -s 대상_파일_또는_디렉터리 링크_이름
3. ln 명령의 일반적인 사용법
ln 명령의 기본적인 구문은 다음과 같습니다:
ln [옵션] 대상 [링크_이름]
대상: 링크할 원본 파일 또는 디렉터리입니다.링크_이름: 새로 생성될 링크의 이름입니다.링크_이름을 지정하지 않으면, 현재 디렉터리에대상과 동일한 이름의 하드 링크가 생성됩니다. (단,대상이 디렉터리인 경우링크_이름은 필수이며, 하드 링크는 생성 불가)
주요 옵션:
-s,--symbolic: 심볼릭 링크를 생성합니다. (기본값은 하드 링크)-f,--force: 이미 존재하는 대상 파일과 동일한 이름의 링크를 덮어씁니다.-v,--verbose: 각 링크가 생성될 때마다 자세한 정보를 출력합니다.-i,--interactive: 기존 링크를 덮어쓰기 전에 사용자에게 확인 메시지를 표시합니다.-P,--physical: (GNU coreutils의ln에서) 심볼릭 링크가 아닌 하드 링크로 간주하고 대상을 추적하지 않습니다. (주로ln -s와 함께 사용될 때 대상 경로를 있는 그대로 사용하게 만듦)
ln 명령은 파일 시스템의 유연성을 높이고, 여러 위치에서 동일한 데이터에 접근하거나, 복잡한 경로를 단순화하는 데 필수적인 유틸리티로 활용됩니다.