대상이 파일이 아닌 심볼릭 링크라는 것을 알고 있다고 가정하면 링크를 사용하는 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( ) 에서 자주 악용 되기 때문에 삭제할 것이 없을 때 실패하지 않습니다.-f
rm
clean: @rm -f $(OBJS) ...
make clean
둘째, 대화형으로 삭제를 확인하는 옵션이 rm
있습니다 .-i
셋째, 디렉터리를 rm
재귀적으로 삭제합니다. 이는 C 라이브러리 함수가 수행하지 않기 때문에 수행할 필요가 없는 작업입니다.-r
unlink
이 unlink
유틸리티는 엄밀히 말하면 단순한 유틸리티는 아닙니다 rm
.기능의 하위 집합을 수행 rm
하지만 의미는 다음과 같은 조합입니다.rm
그리고 -f
그리고 rm아니요 -f
.
자체 권한에 관계없이 일반 파일을 삭제하고 싶다고 가정해 보겠습니다. 또한 파일이 존재하지 않거나 다른 이유로 인해 명령이 실패하도록 하려는 경우도 있습니다. 요구 사항을 충족하지도 rm file
않고 rm -f file
요구 사항을 충족하지도 않습니다. rm file
파일에 쓸 수 없으면 거부됩니다. 그러나 rm -f file
파일이 누락된 경우 불만사항은 무시됩니다. unlink file
작업을 수행합니다.
unlink
아마도 너무 영리하기 때문에 도입되었을 것입니다 rm
. 때로는 순수한 Unix 의미 체계를 원할 수도 있습니다 unlink
."디렉터리 권한이 허용되면 이 디렉터리 항목이 사라지게 만듭니다.".
답변3
답변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