본문 바로가기
Back-end/Linux

ln 명령어: link (하드링크, 소프트링크)

by somlang_bba 2023. 1. 18.
728x90

리눅스는 따로 gui를 제공하지 않고 cli를 통해 위치를 이동하다보니

 

아래 예시와 같은 경우에는 depth가 정말 길어져 하나하나 입력하기가 귀찮을때가 종종 있다.

$> cd /a/b/c/d/e/abc.txt

 

이럴때 사용하면 좋은 것이 바로 ln명령어이다.

 

특정 A 폴더에서 B폴더로 이동이 잦은경우, ln 명령어를 통해 링크를 만들어두면 귀찮은 경로를 일일히 쓸 필요 없이

$> cd 링크명

이렇게 이동이 가능하다.

 

더욱 자세한 내용은 i-node를 이해해야하므로 i-node가 무엇인지 이해해보자.

 

Java를 첫 프로그래밍 언어로 배웠기 때문에 Java에 빗대어 이해해보겠다.

 

i-node는 리눅스상에 저장되어있는 각 파일의 고유한 주소값인데, Java로 따지자면 Heap영역에 객체들의 Hashcode 값이 저장되어 있는 모습과 비교할 수 있을 것 같다.

 

리눅스에서 link는 하드링크와 심볼릭링크(소프트링크)로 구분이 되는데,

하드링크는 파일의 i-node값을 공유하여 새로운 파일을 만들어내는 방식이고 심볼릭링크는 해당 파일의 i-node값만을 가지고 있는 파일이다.

 

예를들어, A폴더와 B폴더가 있다고 가정하고 A폴더에 위치한 aa파일을 원본파일로 하여 B폴더에 하드링크(bb파일)를 만든다고 하면

$> ln /A/aa.txt /B/bb.txt

위와 같은 명령어로 생성이 가능하다.

 

이렇게 생성한 링크는 하드링크이다. 하드링크로 생성한 bb.txt의 내용을 수정하면 aa.txt에도 같은 내용이 반영된다.

 

필자는 이를 보고 Java에서 call by reference로 넘겨준 argument 객체의 값을 변경하면 해당 메서드 밖에있는 객체의 값이 수정되는 것과 비슷하다고 이해했다.

public class Example {
    public static void main(String[] args){
        A a = new A("a");
        System.out.println(a); // Class A [B = a]
        Modifier.modify(a);
        System.out.println(a); // Class A [B = b] => 외부 클래스의 메서드안에서 바꾼거지만 밖에서도 바뀌어있음.
    }
}

class Modifier {
	public static void modify (A a) {
        a.setB("b");
    }
}

class A {
        private String B;

        public A(String b) {
                this.B = b;
        }

        public void setB(String b) {
                this.B = b;
        }

        public String getB() {
                return this.B;
        }

    @Override
    public String toString() {
        return "Class A [B = " + this.B + "]";
    }
}

 

위 코드와 같이 A 클래스의 객체인 a를 modify라는 함수에서 변경을 했지만 값이 변경되어 있는 것을 볼 수 있는데, 이는 객체의 주소값인 해시코드를 통해 변경을 한 것이기 때문에 다른 클래스에서 변경하더라도 같은 객체의 값을 변경한 것이다.

 

같은 맥락으로 하드링크의 경우에도 같은 i-node 값을 바라보고 있기 때문에 원본파일을 수정하던 하드링크파일을 수정하던 그것은 같은 파일을 수정한 것으로 볼 수 있다.

 

한편, -s 옵션을 붙여서 만드는 심볼릭링크(소프트링크)는 링크파일로 cd(change directory) 한 뒤

pwd(print working directory) 명령어를 통해 현재 위치해 있는 경로를 출력해보면 링크명대로 나온다.

이때는 그냥 pwd가 아닌 /bin/pwd를 해주면 실제 파일의 경로를 볼 수 있다.(pwd는 /usr/bin/pwd이기 때문)

 

728x90