"rm"과 "연결 해제"의 차이점은 무엇입니까?

"rm"과 "연결 해제"의 차이점은 무엇입니까?

대상이 파일이 아닌 심볼릭 링크라는 것을 알고 있다고 가정하면 링크를 사용하는 rm것과 제거하는 것 unlink사이에 차이가 있습니까 ?

답변1

이와 같은 문제가 발생할 때마다 실제로 무슨 일이 일어나고 있는지 확인하기 위해 작은 테스트를 수행하는 것이 좋습니다. 이를 위해 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 +++
...

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

발췌

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

pathname에 제공된 경로 이름이 상대 경로인 경우 파일 설명자 dirfd가 참조하는 디렉토리를 기준으로 해석됩니다(unlink(2) 및 rmdir(2가 수행하는 것처럼 호출 프로세스의 현재 작업 디렉토리를 기준으로 하는 대신)). 상대 경로 이름을 나타냅니다).

pathname에 주어진 경로명이 상대적이고 dirfd가 특수 값 AT_FDCWD인 경우, pathname은 호출 프로세스의 현재 작업 디렉터리를 기준으로 해석됩니다(unlink(2) 및 rmdir(2)에서처럼).

pathname에 주어진 경로명이 절대 경로명이라면 dirfd는 무시됩니다.

답변2

POSIX는 unlink유틸리티가 C 라이브러리 unlink함수만 호출하고 다른 함수는 호출하지 않도록 지정합니다. 선택의 여지가 없다. 디렉터리가 아닌 다른 경로에 유효한 경로 이름을 전달하고 개체가 있는 디렉터리에 대한 쓰기 권한이 있으면 unlink해당 개체가 삭제됩니다.

rm는 몇 가지 추가 기능을 갖고 있으며 상위 집합은 아닌 전통적인 Unix 명령입니다 unlink(아래 참조).

첫 번째는 rm안전점검을 실시하는 것입니다. 쓰기 권한 없이 개체 에 액세스하려고 하면 rm(삭제 기능과는 아무 관련이 없습니다. 포함 디렉터리의 권한은 다음과 같습니다!) 지정하지 rm않는 한 해당 개체는 -f여전히 거부됩니다 . rm파일이 없으면 일반적으로 불평 하지만 , unlink있으면 불평하지 않습니다. 이는 Makefiles( ) 에서 자주 악용 되기 때문에 삭제할 것이 없을 때 실패하지 않습니다.-frmclean: @rm -f $(OBJS) ...make clean

둘째, 대화형으로 삭제를 확인하는 옵션이 rm있습니다 .-i

셋째, 디렉터리를 rm재귀적으로 삭제합니다. 이는 C 라이브러리 함수가 수행하지 않기 때문에 수행할 필요가 없는 작업입니다.-runlink

unlink유틸리티는 엄밀히 말하면 단순한 유틸리티는 아닙니다 rm.기능의 하위 집합을 수행 rm하지만 의미는 다음과 같은 조합입니다.rm 그리고 -f그리고 rm아니요 -f.

자체 권한에 관계없이 일반 파일을 삭제하고 싶다고 가정해 보겠습니다. 또한 파일이 존재하지 않거나 다른 이유로 인해 명령이 실패하도록 하려는 경우도 있습니다. 요구 사항을 충족하지도 rm file않고 rm -f file요구 사항을 충족하지도 않습니다. rm file파일에 쓸 수 없으면 거부됩니다. 그러나 rm -f file파일이 누락된 경우 불만사항은 무시됩니다. unlink file작업을 수행합니다.

unlink아마도 너무 영리하기 때문에 도입되었을 것입니다 rm. 때로는 순수한 Unix 의미 체계를 원할 수도 있습니다 unlink."디렉터리 권한이 허용되면 이 디렉터리 항목이 사라지게 만듭니다.".

답변3

단일 파일을 사용하고,RM그리고풀리다동일한 작업을 수행하고 파일을 삭제합니다. POSIX 정의에 따르면 rm둘 다 unlink호출합니다.풀리다()시스템 호출.

GNU에서는 rm다음을 호출합니다.풀리다()unlink()또는와 동등한 시스템 호출rmdir()함수. 단, path가 상대 경로를 지정하는 경우는 제외됩니다.

노트

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

답변4

또한 rm을 사용하면 glob을 사용하여 여러 파일을 삭제할 수 있습니다. 연결을 해제하면 한 번에 하나씩 파일을 삭제할 수 있습니다.

touch f{1..10}
rm f*           # works 

touch f{1..10}
unlink f*       # doesn't work (expands to unlink f1 f2 ... f10)
unlink f1       # works

관련 정보