'rm'과 'unlink'의 차이점은 무엇입니까?


55

대상이 파일이 아니라 기호 링크라는 것을 알고 있다고 가정하면 링크 사용 rmunlink제거 사이에 차이점이 있습니까?


3
이것은 ServerFault : serverfault.com/questions/38816/…
slm

@ slm ♦ 답변은 해당 질문에 해당하지만이 질문은 다릅니다. "대상이 파일이 아니라 기호 링크라는 것을 알고 있다고 가정합니다."
Stéphane Gourichon

@IQAndreas에 대한 답변을 수락 한 것 같지 않습니다. 그들이 당신을 도우면 그렇게하십시오.
그레이

답변:


56

이러한 유형의 질문이있을 때마다 실제 상황을 확인하기 위해 약간의 테스트를하는 것이 가장 좋습니다. 이를 위해을 사용할 수 있습니다 strace.

풀리다

$ touch file1
$ strace -s 2000 -o unlink.log unlink file1

rm

$ touch file1
$ strace -s 2000 -o rm.log rm file1

2 개의 결과 로그 파일을 살펴보면 각 호출이 실제로 수행중인 작업을 "볼 수 있습니다".

고장

시스템 호출을 unlink호출 하면 다음과 unlink()같습니다.

....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3)                                = 0
unlink("file1")                         = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
....

으로 rm는 약간 다른 경로는 다음과 같습니다

....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid()                               = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK)      = 0
unlinkat(AT_FDCWD, "file1", 0)          = 0
lseek(0, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++
...

시스템 은이 매뉴얼 페이지 ( http://linux.die.net/man/2/unlinkat)에 설명 된 차이점을 제외 unlink()하고 unlinkat()는 기본적으로 동일 합니다.

발췌

unlinkat () 시스템 호출은이 매뉴얼 페이지에 설명 된 차이점을 제외하고 unlink (2) 또는 rmdir (2)와 동일한 방식으로 작동합니다 (플래그에 AT_REMOVEDIR 플래그가 포함되는지 여부에 따라 다름).

pathname에 지정된 경로 이름이 상대 경로 인 경우 unlink (2) 및 rmdir (2에 의해 수행되는 것처럼 호출 프로세스의 현재 작업 디렉토리가 아닌 파일 디스크립터 dirfd가 참조하는 디렉토리를 기준으로 해석됩니다. )는 상대 경로 이름입니다.

pathname에 지정된 경로 이름이 상대 경로이고 dirfd가 특수 값 AT_FDCWD 인 경우, 경로 이름은 호출 프로세스의 현재 작업 디렉토리 (예 : unlink (2) 및 rmdir (2))를 기준으로 해석됩니다.

pathname에 지정된 경로 이름이 절대이면 dirfd는 무시됩니다.


1
는을 제공하기 때문에 와의 AT_FDCWD차이점이 없습니다 . unlinkunlinkat
Barmar

6
나는 종종 물고기를 얻을 때 강력하고 융통성있는 방식으로 "물고기를 배웠다"거나 때로는 SO를 기본 방식으로 "물고기를 배운다":-)
Sage

20

POSIX는 unlink유틸리티가 C 라이브러리 unlink함수를 호출하고 다른 것은 호출하지 않도록 지정합니다 . 옵션이 없습니다. 디렉토리가 아닌 다른 경로에 유효한 경로 이름을 전달하고 해당 오브젝트가있는 디렉토리에 대한 쓰기 권한이 있으면 unlink제거하십시오.

rm전통적인 유닉스 명령어는 약간의 다른 기능을 가지고 있으며 unlink(아래 참조) 의 슈퍼 세트가 아닙니다 .

먼저 rm안전 점검을 수행합니다. 그럼에도 불구하고 rm쓰기 권한이없는 개체를 제거 하려고 시도하면 (삭제 권한과 무관 : 직접 권한이 있습니다!)을 지정 rm하지 않으면 거부 -f합니다. rm파일이 존재하지 않으면 일반적으로 불평합니다 unlink. 그러나와 -f, rm불평하지 않습니다. 이것은 종종 Makefiles ( clean: @rm -f $(OBJS) ...) 에서 악용 되므로 make clean제거 할 것이 없어도 실패하지 않습니다.

둘째, rm-i대화 삭제를 확인하는 옵션을 선택합니다.

셋째, rm-r반복적으로 무언가 디렉토리, 제거하기위한 unlinkC 라이브러리 기능은 그렇게하지 않기 때문에, 할 필요하지 않습니다.

unlink유틸리티는 정확히 제거되지 않았습니다 rm. 그것은 수행하는 것의 부분 집합을 수행 rm하지만 rm with -f 와 rm이 없는 시맨틱을 가지고있다 -f.

자체 권한에 관계없이 일반 파일 만 제거하려고한다고 가정하십시오. 또한 파일이 존재하지 않거나 다른 이유로 명령이 실패한다고 가정하십시오. 요구 사항 rm filerm -f file충족 하지도 않습니다 . rm file파일을 쓸 수 없으면 거부합니다. 그러나 rm -f file파일이 없으면 불만을 소홀히합니다. unlink file일을한다.

unlink아마 때문에 도입 rm이 너무 영리하다 : 때로는 그냥 순수 유닉스하려는 unlink의미는 : "디렉토리 권한을 허용하는 경우이 디렉토리 항목이 사라 확인하십시오" .


2
이것이 가장 명확한 대답입니다. 실제로 차이점을 설명하는 것이 아니라 유스 케이스 를 제공합니다 unlink.
와일드 카드

19

단일 파일을 사용하여 rmunlink 는 동일한 작업을 수행하고 파일을 제거하십시오. POSIX 정의로서, rm그리고 unlink모두 호출하기 () 해제 시스템 호출을.

GNU에서 rm, 그 호출 () unlinkat 받는 동등한 시스템 호출, unlink()또는 RMDIR () 로 상대 경로를 지정하는 경우를 제외하고 기능.

노트

일부 시스템에서는 unlink디렉토리를 제거 할 수도 있습니다. 적어도 GNU 시스템에서는 unlink디렉토리 이름을 절대 삭제할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.