[완료] ln과 cp?

나그네나그네의 이미지

ln이 링크라는 것, cp가 복사라는 건 대충 어디서 주워들어서 알겠는데 -_-;

ln -s를 실행시켜보면 '아 이게 링크다'라는 걸 알겠는데, 그냥 ln명령어로 링크시켜놓은 건 구분을 할 수가 없네요.

링크와 실제 파일을 구별할 수 있는 방법이 있는건가요? 아니면 복사와 별다른 차이점이 없는건가요?

익명 사용자의 이미지

ln이 하드링크고 ln -s가 소프트링크, 심볼릭링크라고도 하는 겁니다만... 심볼릭링크는 어느 데이터 단위를 사용자가 접근하기 용이하도록 이름을 붙인 이름표인 파일명에 거는겁니다. (데이터)<-(기존 파일명)<-(ln -s로 생성된 파일명)

하드링크는 그냥 데이터에 이름표를 하나 더 붙이는겁니다. (ln으로 생성된 파일명)->(데이터)<-(기존 파일명)
심볼릭링크로 생성된 파일명은 기존의 파일명을 거쳐 데이터를 가리키는거지만 ln은 해당 데이터를 가리키는 이름이 하나 더 생긴겁니다. 기존 파일명과 위치에 있어 아무런 차이가 없지요.

복사와 다른 점은 복사는 데이터를 똑같은 걸 하나 또 만들어 두는겁니다. cp file1 file2를 한다고 하면 (file1)->(기존 데이터),(file2)->(복제된 데이터) 이렇게 되지요. 이러면 저장공간을 기존보다 대략 두배정도 먹게 되지요. ln file1 file2를 하면 가리키는 파일은 두개가 되지만 데이터는 기존대로 하나만 있어 저장공간을 그다지 불리지 않습니다.

ln -s로 생성된 심볼릭링크파일은 상기했다시피 기존 파일명을 거쳐 데이터를 가리키는 것이기 때문에 파일을 지우면 데이터도 날아가고 링크파일은 아무 쓸모가 없어집니다. ln으로 하드링크한 파일명은 기존 파일명과 위치상 차이가 없기 때문에 기존 파일을 지워도 데이터를 가리키고 있지요. 물론 이마저 지우면 데이터가 정말 날아가겠습니다만... 그리고 하드링크는 동일 파티션 안에서만 생성가능한 제약도 있고 뭐 그렇습니다...

나그네나그네의 이미지

자세한 답변 감사합니다 꾸벅
----------------
agidari.wordpress.com

vamf12의 이미지

사실 하드 링크라는 것은 없습니다... -_- 소프트 링크 VS 하드 링크 라는 개념 자체가 잘못된 것입니다.
(애초에 이름을 저렇게 지어서, 덕분에 많은 분들 께서 햇갈리시는듯)

일단 파일은 원래 파일명을 가지지 않습니다. inode라는 번호를 받을 뿐입니다. 파일명은 디렉토리파일에서 inode와 매칭되는 일종의 별명입니다.

예를 들어서 /home/user1 이라는 디렉토리가 있습니다. 여기에 aa라를 파일을 생성합니다.
그러면 user1디렉토리 파일에서 1001과 같은 inode와 aa라는 파일명이 기록됩니다. aa라는 파일을 읽을 경우 user1디렉토리 파일을 뒤져서 aa에 매칭되는 inode를 거꾸로 찾은다음 inode를 이용해서 실제 파일에 접근합니다. (주의 하실 점이 디렉토리도 하나의 파일입니다. 해당 디렉토리에 속하는 파일에 대한 inode와 파일명을 가지고 있는 파일입니다.)

위처럼 inode와 파일명을 매칭시켜서 디렉토리 파일에 기록하는 것을 링크라고 합니다. 모든 파일은 한개 이상의 링크를 가질때 존재하는 것으로 간주합니다. (반대로 파일을 지우는 행위는 디렉토리 파일에 기록된 inode와 파일명을 지우는 것입니다. 즉링크를 삭제 하는 것입니다.)

하드링크는 링크를 다르게 부르는 것입니다. ln /home/user1/aa /home/user1/bb 라는 명령을 주게 되면, user1디렉토리 파일에
1001 aa
1001 bb
처럼 기록이 됩니다. 1001 inode를 가지는 파일에 대한 파일명을 두개 붙인것일 뿐입니다.

그런 소프트 링크는 뭘까요? 소프트 링크는 윈도우의 단축아이콘입니다. (혹자는 절대로 그렇지 않다고 하는데, 똑같습니다... -_- 다만 기능적으로 더 쓸만하다 뿐이지, 동작하는 원리자체가 동일합니다.)

하드 링크는 두가지 특징을 가집니다.
1. inode의 특성상 파티션 경계를 넘을 수 없다. inode는 한 파티션 상에서 유일한 존재입니다. 따라서 다른 파티션에서 inode를 기준으로 호출할 수는 없습니다. (소프트 링크는 파티션 경계를 넘을수 있습니다. 소프트 링크는 디렉토리와 파일명으로 동작하기 때문이죠 ^^)
2. 디렉토리는 하드 링크를 만들 수 없다. 애초에 디렉토리를 만드는 것도 링크 입니다. 다만 이런 제약을 둔것은 디렉토리 구조가 꼬여 버릴수 있기 때문입니다. ln /home/user1 /home/user1/user1 이런식으로 링크를 거는게 가능하면 않되겠죠? 가능하다고 할때, find /home/user1 -typed 해버리면... 결코 끝나지 않는 무한 반복이 되어 버리겠죠 ㅎㅎ

feanor의 이미지

소프트링크는 윈도우즈의 단축아이콘이 아닙니다. 윈도우즈의 단축아이콘에 해당하는 것은 .desktop 파일입니다.

우선, 소프트링크에는 아이콘이 없습니다.

.desktop 파일은 예를 들어 xchat.desktop을 보면

[Desktop Entry]
Exec=xchat
Icon=xchat.png
Terminal=false

등으로 되어 있는데, 윈도우즈의 .lnk 파일에도 이와 같은 정보가 들어 있습니다. 바이너리 포맷이라는 점이 다를 뿐입니다.

vamf12의 이미지

소프트링크와 단축 아이콘 자체가 완전하게 동일하다는 표현은 아니었습니다.

실제로 구현되는 방법자체가 동일하다는 뜻이었습니다. 엎어치나 매치나 동일하다고, 둘다 원본의 경로를 가지고 있는 파일이죠.

소프트링크와 단축 아이콘(WIN32, .desktop, OSX)들은 다들 완전하게 동일 하진 않습니다.
하지만, 하드링크VS(소프트링크&단축아이콘)의 관계는 성립한다는 뜻이었습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.