ln의 매개 변수 순서를 기억하기위한 팁?


64

나는 ln수년간 상징적 인 링크를 쓰는 데 사용 했지만 여전히 매개 변수의 순서가 잘못되었습니다.

이것은 일반적으로 다음과 같이 작성합니다.

ln -s a b

그런 다음 출력을보고 나 자신을 생각 나게합니다.

나는 a -> b그것이 실제로 반대 일 때 그것을 읽은 것처럼 항상 상상합니다 b -> a. 이것은 반 직관적 인 느낌이 들기 때문에 항상 제 자신을 추측합니다.

누구든지 올바른 순서를 기억하는 데 도움이되는 팁이 있습니까?


11
때때로 그것은 당신이 그것을 입력 할 때 outloud을 말을하는 데 도움이 "심볼릭 링크 a, 그리고 전화 b"
jsotola

2
cp와 마찬가지로 두 번째 매개 변수를 작성하고 링크를 작성합니다. 그러나 잘못된 방법으로 기존 파일을 덮어 쓰거나 새 링크로 심볼릭 링크를 작성할 수 없으므로 걱정할 필요가 없습니다.
sudodus


1
그것을 "나쁜 녀석의 별명"으로 생각하십시오. 그는 항상 그의 실명으로 언급 된 다음 그의 별명으로 언급됩니다. 예 : Tony Baloney (일명 Oscar Meyer). 또는 링크의 경우 ln -sab는 "File-a는 File-b라고도 함"을 의미합니다.
Scottie H

1
ln source target. 동일 cp source target, mv source target; ...
user207421

답변:


40

나는 다음을 사용한다 : ln하나의 인수 형식 ( 맨 페이지에 나열된 두 번째 형식 )이 있고 목표 만 ln알면 (목표를 몰라도 전혀 작동하지 않을 수 있기 때문에 ) ln현재 디렉토리에 링크를 만든다. 2 인수 형식은 1 인수 형식에 추가 된 것이므로 대상은 항상 첫 번째 인수입니다.


3
대상 / 대상 경로가없는 양식은의 POSIX 사양을 확장 한 것입니다 ln.
Kusalananda

1
@ 쿠사 : 당신은 하나의 인수 양식으로 내 대답에 1971 매뉴얼을 보았습니까? 1971 년에 posix가 있다면 어떻게 확장 할 수 있습니까? --- "name2가 지정되면 링크의 이름이 지정됩니다"

@SP 나는 당신이 무슨 뜻인지 잘 모르겠습니다. 역사적 구현이 현재 POSIX 표준을 능가한다고 말하고 있습니까?
Kusalananda

1
나도 봅니다. 적어도 다른 이름, 같은 인수. 나는 gnu 가이 arg 이름을 가진 유일한 사람이라는 것을 몰랐습니다.

2
여기에 많은 좋은 답변이 있었지만 (특히 @loa_in_의 운율) 나는 이것과 함께 갈 것입니다. 매개 변수의 순서가 일관 적이라고 (을 무시 -t) 진술하면 거의 증거처럼 느껴집니다. " ln현재 디렉토리에 링크를 작성합니다. 2 인수 양식은 1 인수 양식에 추가되므로 대상은 항상 첫 번째 인수입니다." 두 번째 양식을 고려할 때 이것이 사실 이라는 것이 합리적 이므로 이것이 내가 기억하는 데 도움이 될 것이라고 생각합니다.
Zhro

85

나는 " ln와 같다 cp. '원본'이 먼저 와야한다."


20
... 좋아요 mv. mv, cp그리고 ln모두가 두 번째 인수로 첫 번째 인수로 기존 파일 및 의도 된 대상 파일 또는 디렉터리 이름을.
Hans-Martin Mosner

7
그것은 부끄러운 memcpy, strcpy주위에 다른 방식으로 작동 등.
Arkadiusz Drabczyk

6
@ Hans-MartinMosner, 심볼릭 링크를 만들 때 기존 파일 일 필요는 없다는 점을 제외하고 ...
ilkkachu

1
@ilkkachu 당신이 맞아요. 예외없이 규칙 없음 :-)
Hans-Martin Mosner

1
@ArkadiuszDrabczyk 반면에, memcpy(dest,src,n);지도 와 같은 것은 매우 잘 어울 dest = src;립니다. 즉, 첫 번째 n바이트의 dest를 nsrc 의 첫 번째 바이트와 동일하게 설정하십시오 .
CVn

10

대부분의 Unices는 ln명령을 다음과 같이 문서화합니다

ln source target

(여기에서 옵션 등을 생략하고 있습니다)

예 :

  • POSIX 표준

    ln [-fs] [-L|-P] source_file target_file
    
  • OpenBSD :

    ln [-fhLnPs] source [target]
    
  • NetBSDFreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • 맥 OS

    ln [-Ffhinsv] source_file [target_file]
    
  • 솔라리스

    /usr/bin/ln [-fns] source_file [target]
    
  • AIX

    ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
    

는 GNU ln매뉴얼은 호출 source 대상target LINKNAME을 .

단어의 GNU 선택을 무시하고 ln유틸리티는 예를 들어, 같은 의미의 동일한 종류를 다음 mvcp점에서 대상 으로부터 생성되는 것입니다 소스 .

따라서,

ln -s a b

b가리키는 심볼릭 링크를 만듭니다 a.

또한 심볼릭 링크를 만들 때 소스는 단순히 심볼릭 링크가 가리키는 것을 나타내는 문자열입니다. 일반적으로 유용한 정보를 가리키는 지 확인하기위한 검사는 없습니다.

$ ln -s "hello world" README.txt
$ ls -l
total 0
lrwxr-xr-x  1 kk  wheel  11 Sep 15 11:39 README.txt -> hello world

5
나는 사람들이 이것을 잘못 알고 있다는 사실에 대한 GNU 문서를 전적으로 비난합니다. 그들의 말은 후시로 이해할 수 있지만 객관적으로 혼란 스럽습니다.
Konrad Rudolph

6
@KonradRudolph, 반대로 GNU 문구는 제게 자리에있는 것 같습니다. 이 유틸리티는 이름을 가진 링크를 만들어 어딘가를 가리 킵니다. "링크의 이름은"좀 분명하고, "대상"지적 뭔가를 완벽하게 좋은 설명입니다 . 일화로서, 나는 여전히 어떤 방법이 ln -s a b효과가 있는지 생각 해야하며, 이는 GNU 매뉴얼과 관련이 없습니다. 맨 페이지의 문구를 본 적이 없다고 생각하기 때문입니다. : D ( ln -si a b확실하지 않은 상태에서 실행하는 것이 더 쉬우 며 b이미 존재하는 경우 불평 합니다.)
ilkkachu

1
@KonradRudolph는 기술적으로는 하드 링크의 경우 "target"이라고 부르는 것이 잘못되었습니다 . 기존 이름이 아니라 실제 대상인 inode이기 때문입니다. GNU 사람들이 일반 사용자가 그렇게 자세하게 생각할 필요가 없다고 생각하는지 궁금합니다.
ilkkachu

@gary의 답변에서 언급했듯이 POSIX 표준에서 대상 이 선택 사항이 아님 을 지적하는 것이 흥미 롭습니다 .
Zhro

@ kusa : "ln -s AB --- 파일 이름 만 B에 복사"와 함께 약간 변경된 컨텍스트에서 해석을 채택했습니다. 나는 당신의 급진적 인 "hello world"예제에도 동의 할 수 있습니다. "파일 이름 만"문자열입니다. 비트를 편집하고 많이 추가했다는 신호를

7

이것이 누군가에게 도움이되는 경우 : 나는 그것을 "ln what where " 로 생각하는 데 익숙해졌습니다 . 첫 번째 인수 ( "what")는 기존 파일이고 두 번째 인수 ( "where")는 장소입니다 그것을 (링크) 넣습니다. 대부분의 다른 대답의 추론과는 달리, 이것은 기억 보조제 역할을하는 명령을 입력 할 때 정신적으로 암송 할 수있는 까다로운 문구에 지나지 않습니다. 이것은 아마도 모든 사람에게 유용하지는 않지만 일부 사람들에게는 도움이 될 것으로 생각됩니다.

다른 표준 파일 조작 명령이 동일한 규칙을 사용하는 데 도움이되므로 cpand에 대해서도 동일한 작업을 수행 할 수 있습니다 mv.


4
왜 이것이 다운 피트되었는지에 대한 아이디어가 궁금합니다. 여기에 잘못 될 수있는 것은 많지 않습니다-주문이나 무언가를 섞었습니까?
David Z

나는 개인적으로 설명없이 "어디서"에 모호한 것이 아니라고 생각합니다. "링크를 가리키는 링크는 무엇입니까?" (정확한) 또는 "무엇과 연결되어 있습니까?" (잘못된). "링크가 가리키는 곳은 어디입니까?"와 동일 (잘못된) 또는 "링크를 작성해야하는 위치"(올바른). 따라서 자신을 다시 추측하는 경우에는 이것이 그렇게 많은 도움이되지는 않습니다. cp와 mv를 기억하면 도움이 될 것입니다.
125_m_125

우리는 UNIX 명령이 다른 종류의 인수 뒤에 파일 인수를 포함 할 것으로 기대합니다 (예 : grep처럼). ln은 주어진 내용으로 특정 유형의 파일을 만듭니다. 파일 시스템이 특별한 작업을 수행하고 일반적으로 소스 파일의 경로를 ln에 넣는 경우가 있습니다. 예를 들어, 첫 번째 줄의 내용을 1 등의 심볼릭 링크에 저장하는 텍스트 편집기를 작성할 수 있습니다. 이것은 멍청하지만 ln은 텍스트 내용이있는 파일을 작성합니다. 인수 순서를 논리적으로 보이게합니다.
Dannie

@ 125_m_125 당신이 제시 한 대체 해석은 나에게는 이해가되지 않지만 괜찮습니다. 이 기억 보조는 모든 사람을위한 것이 아닙니다.
David Z

6

나는 최근에이 특별한 것을 기억하는 좋은 방법을 들었습니다 : 운율

오래된 것, 새로운 것

빌린 물건, 파란 물건,

그녀의 신발에 6 펜스.

첫 번째 구절은 ln의 인수입니다. 오래된 것 뒤에 새 디렉토리 항목의 이름이옵니다.


3
NAME    ln -- make a link
SYNOPSIS    ln name1[ name2 ]
DESCRIPTION ln creates a link to an existing file name1. 
            If name2 is given, the link has that name; 

1971 년부터 Unix First Edition 매뉴얼 .

있다 둘째 , 간단한 문법 형태.


편집 : 나는 주소 등의 의견을 참조 또한 하단의 매우 긴 또한 참조 --- TARGET 대신 FILE 또는 FILENAME을 넣어 빙산, 하드와 소프트ln, 그것의 단지 끝을.


그래서 GNU ln는 이것을 가지고 있습니다 :

ln [opt] FILENAME

In the 2nd form, create a link to FILENAME in the current directory.

링크 이름이 필요하지 않은 곳. ln -s /usr/lib/modules당신이 얻을 후

modules -> /usr/lib/modules

현재 위치에 FILENAME ( "target"또는 "source")과 동일한 이름이 있습니다. 선택도없고 혼란도 없습니다.

당신이 더 요구하고 아래에 생성 링크하려면 이제 다른 이름 및 / 또는 다른 곳을 , 당신은 추가 이름이나 경로로 그 소원을. 실제 목표는 첫 번째로, 환상의 새 링크 이름은 두 번째입니다.


또는 "당신은 ls -l링크 에 대한 이 화살표 표기법을 알고 있습니다. 쉘에 화살표가 없어서 링크의 방향을 표시 할 수 없습니다. 그래서 그것을 바꿔야합니다."

한 방향으로 작성하므로 다른 방향으로 사용할 수 있습니다.

(질문-질문 부분의 끝)


다른 차원에서, "링크"라는 단어 자체는 깊은 숨겨진 이중 의미를 가지고 있습니다. 심볼릭 링크는 나중에 왔으므로 초기에는 링크가 링크였습니다. 부드럽고 단단하지 않고 -s옵션 도 없었습니다 . 그리고 이제는 소스-타겟 심볼리즘도 사용합니다 :

mv    A B   --- move the whole file to B (dir or new name)
cp    A B   --- copy whole file (mv and cp are "the same" here)    
ln    A B   --- copy whole file MINUS data blocks (=copy only inode and name), and increase "link count" for track keeping

이 단계에는 링크가 있지만 단단하고 부드럽 지 ls -l않으며 화살표가 표시되지 않습니다. (하드) 링크에는 방향이 없기 때문입니다. 유닉스 진화 단계에서 "링크"는 파일 시스템의 파일 이름 "B"(디렉토리 항목 "B")가 파일 이름 "A"가 가리키는 것과 동일한 inode를 가리키는 것을 의미합니다.

파일 A와 B는 동일한 블록을 공유하기 때문에 "연결"됩니다. 이제 모든 rm에서 커널은 확인해야합니다 : 디스크 에서이 파일의 블록을 삭제 / 해제합니까, 아니면 동일한 블록에 연결된 다른 파일이 있습니까? 이를 위해 링크 카운터가 사용됩니다.

삭제되는 / tmp grom에 큰 파일을 유지하고 싶다고 가정하십시오 ln /tmp/bigfile. 이제 작업 디렉토리에 큰 파일이 있습니다. / tmp를 청소하고 "원본"을 이동 한 후에는 동일한 데이터 블록을 사용하는 것이 좋습니다. 연결이 끊어 지거나 매달려 있지 않으면 정상적인 파일이 있습니다. 파일을 가리 키지 않고 파일 시스템 만 가리키는 것은 모든 dir 항목과 마찬가지로 차단합니다. 현재 "청소"/ tmp는 그다지 효율적이지 않습니다. 비어있는 것처럼 보이지만 파티션의 블록은 해제되지 않습니다.

하드 링크는 cp처럼 간접적으로 공간 자체를 소비하지는 않지만 간접적으로 가능합니다.

ln -s위 시퀀스에 추가 :

ln -s A B   --- copy only the file's name to "B"   

이제 소프트 링크 인 "B"에는 경로 이름이있는 문자열 만 있습니다. "소프트"정보입니다. 기술적으로 "A"와 "B"는 관련이 없습니다. 그러나 여전히 B는 새로운 의미에서 "링크"이며, 저장된 경로 이름 을 "A" 의 바로 가기 로 사용할 수 있습니다 . 이제는 "A에 대한 링크" (기간)이며 "파일 A의 inode와 연결 되지 않았습니다 "

두 종류의 링크는 인간뿐만 아니라 커널 / fs도 혼동 할 수 있습니다. 1971 맨 페이지 참고 : "BUGS : 링크가 두 번 백업되고 별도의 inode가있는 별도의 파일로 복원됩니다."

디렉토리에 대한 하드 링크 (희귀 / 허용되지 않음)는 쉽게 막힘을 유발할 수 있습니다.

디렉토리에 대한 소프트 링크 (매우 일반적)는 영구 루프로 이어질 수 있습니다. 유틸리티 / 커널에 의해 인식되어야합니다.

bash에서의 실제 예

일반 파일 "F"로 시작하는 중 ...

ln F Fhard

... Fhard를 F와 같은 크기로 만들지 만 둘 다 화살표가없는 진한 빨간색으로 나타납니다 ls -l --color. stat"Inode : xyz"와 관련하여 "Links : 2" 를 표시 하기 때문입니다 . 하드 링크 F는 F 자체를 하드 링크로 바꿉니다. 둘 다 / stay 파일 유형 "일반 파일"입니다. 그러나 둘 다 1보다 큰 링크 수를 가진 inode를 가지고 있습니다.

   ln -s F Fsoft

... 파일 유형이 "symbolic link"인 작은 "비정규"파일 "Fsoft"를 만듭니다. --- 빈 디렉토리보다 훨씬 더 많은 공간을 절약합니다. A ls -l는 "F"에 특별한 것을 보여주지 않습니다. Fsoft의 경우 문자열이 'F'이므로 표시된 크기는 1 바이트이며 Fsoft -> F이름으로 표시됩니다. 소프트 링크를 인식하기 위해 소프트 링크를 채색 할 필요가 없습니다. 짧은 형태 ls -F로 코일 체인이 @ 추가 되기 때문에 :Fsoft@

으로 ls -l는 다음과 같습니다 :

-rw-r--r-- 2 root root 6070340 Sep 16 16:28 F
-rw-r--r-- 2 root root 6070340 Sep 16 16:28 Fhard
lrwxrwxrwx 1 root root       1 Sep 16 16:31 Fsoft -> F

Fhard는 F의 크기와 유형을 가지고 있습니다.

Fsoft는 F의 이름과 F의 이름 길이를 크기 및 파일 형식이 다릅니다.

짧은 ls -sF:

5932 F    5932 Fhard     0 Fsoft@

추가 --block-size=1해도 같은 크기가 아닙니다. Fsoft의 크기는 "1 바이트, 제로 블록"입니다. F와 Fhard는 동시에 일탈합니다 :

6074368 F  6074368 Fhard    0 Fsoft@

Fsoft가 매달려 있는지 여부를 확인하려면 ls색상을 사용하십시오.

ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file

2

링크 이름은 선택 사항임을 기억하는 것이 정말 도움이됩니다. 지정하지 않으면 링크 대상의 기본 이름이 사용됩니다.

ln -s /path/to/file1 file1

링크 이름을 완전히 삭제하는 것과 같습니다.

ln -s /path/to/file1

링크 대상이 마지막으로 언급 된 경우에는 의미가 없습니다.


1

오른쪽에 유닉스-> AT & T-> 목적지를 생각하십시오.

mov %eax, %ebx  ;; AT&T style assembler syntax: %ebx register gets value of %ecx

mv foo bar    ;; foo renamed to bar

cp foo bar    ;; contents of foo go to bar

foo | bar     ;; data moves left to right in pipeline

ln abc def    ;; link to abc installed as def

"cp foo bar"는 "to bar"를 의미합니다. "ln abc def"는 "to abc"를 의미합니다. "to foo"기호를 유지 한 경우 바로 문제입니다.

@ user370539 그것은 사실이 아닙니다. 이후 ln abc def, abcdef같은 목적이며; 그들은 구별 할 수 없다. 또한 abc링크 수를 늘리는 것 외에는 작업에 영향을 미치지 않습니다 . 목적지는 def입니다. 객체에 대한 포인터가 해당 def위치에 새로 설치되었습니다 .
카즈

@ user370539 링크가 기호 인 ln -s abc def경우 컨텐츠 abc가 location에 기록됨을 의미합니다 def. abc아무것도 해결하지 않아도됩니다. 매달려있는 링크 일 수 있습니다.
Kaz

귀하의 의견은 정확히 ... 잘못되었습니다. 다른 방향이어야합니다.
rexkogitans

@rexkogitans 내 요점은 일관성이 있다는 것입니다. 순서가 "잘못"이고 반전해야하는 경우, 그것은 모든 명령에 대해해야한다 : mv dest src, ln [ -s ] dest src, cp dest src, ...
카즈

0

개인적 으로 X는 필요할 때 X 를 찾을 위치를 알기 위해 X를 기억 하지 않는 것을 선호 합니다. 나는 또한 "미안보다 더 안전하다"는 태도를 좋아하므로 항상 내가 쓰고있는 내용, 특히 루트로주의 깊게 확인하고 싶습니다.

이 경우에 대한 답은 말 그대로 맨 페이지의 첫 줄에 있습니다.

   ln [OPTION]... [-T] TARGET LINK_NAME
   (...)
   In the 1st form, create a link to TARGET with the name LINK_NAME.

맨 페이지를 파헤쳐 야한다면 제안하지는 않았지만, 시작부터 맞기 때문에 IMHO는 입력 man ln하고 끝내는 데 3 초의 가치가 있습니다.


-1

필자가“이것에 복사”로 정신적으로 읽은 cp와 비슷하게 ln 명령을“이것에 링크”로 읽습니다.


2
이것은 최상위 답변 과 매우 유사합니다 .
Michael

그래서 "ln -s AB '는 A와 B를 연결합니까? 지금은 A-> B 또는 B-> A입니까? 나는 혼란의 첫 단계조차 통과하지 못했다고 생각합니다. 그들은 단순하다고 말하지만, 단지 잘못입니다.

-2

이것이 내가 기억하는 방법이다 : 목표를 잊어라. 즉, dir1에 있고 / some / other / dir /에 존재하는 file1에 대한 심볼릭 링크를 만들려면 다음과 같이하십시오.

ln -s /some/other/dir/file1

dir1에 / some / other / dir / file1을 가리키는 file1이라는 심볼릭 링크가 나타납니다. ln의 맨 페이지에서 :

ln [OPTION] ... TARGET (두 번째 형식) ... 두 번째 형식에서 현재 디렉토리에 TARGET에 대한 링크를 작성하십시오.

심볼릭 링크가 대상과 동일한 이름을 갖기를 원할 때만 작동합니다 (대부분의 경우).


왜 이것이 다운 다운되었는지 설명해 주시겠습니까? 방금 맨 페이지에서 복사하여 붙여 넣었습니다. SE에 게시하는 방법을 다른 사람들이 이해하는 데 도움이됩니다. 감사.
호핑 버니

나는 설명 할 수있다 : 그것은 문화적 충돌이다. 걱정마 다른 답변, 의견을 확인하십시오 ...

-3

@gary의 답변을 확장하고 싶습니다.

그의 anwer 외에도 :이 ln명령은 임의의 수의 인수를 허용하므로 한 번의 호출로 여러 심볼릭 링크를 만들 수 있습니다 (필요할 때 편리함).

  1. 그 지식으로, 당신이 만났을 때 ln -s foo bar baz, 어떤 주장이 무엇을 의미하는지 가장 논리적으로 설명하는 것은 무엇입니까?
  2. # 1에 대한 답으로을 만날 때 ln -s foo bar어떤 인수가 무엇을 의미하는지 가장 논리적으로 설명하는 것은 무엇입니까?

1
gary의 답변에 추가 사항이 있으면 편집으로 제안하십시오. 있는 그대로, 두 개의 후행 (가설적인) 질문은이 "답변"을 두 번째 질문처럼 보이게합니다.
Jeff Schaller

-3

ln하나의 명령으로 여러 (심볼릭) 링크를 만들 수 있는 버전을 상상해보십시오 .

Synopsis: ln -s TARGET NEW_LINK...
Example: ln -s target_file  new_link_1  new_link_2  new_link_3

심볼릭 링크는 한 번 TARGET에 하나만 가리킬 수 있고 일반적인 명령 줄 규칙은 반복되는 부분을 명령 줄의 끝 부분에 두는 것입니다.grep PAT [FILE]...


-6

" 그래서 ls보여줍니다 "a -> bln a b

이것이 잘못되었음을 기억하십시오.


6
나는 항상 "무언가가 항상 틀렸다"는 것을 기억합니다. 그러나 어느 방법이 잘못 되었습니까? 그게 바로 문제 야. 문제는 내가 올바르게 이해하더라도 내 자신을 두 번째 추측하는 것이됩니다. 실제로 정확한 주문을 기억할 수 없기 때문에!
Zhro

의 출력이 : 나는 당신이 무슨 뜻인지 이해 생각 ls -l: link -> target위로 설정하는 방법에 대한 당신의 생각 혼동 할 수 ln명령 줄을. 그러나 나는 그것이별로 도움이되지 않을 것을 두려워합니다.
sudodus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.