rm -rf는 심볼릭 링크를 따르나요?

rm -rf는 심볼릭 링크를 따르나요?

다음과 같은 디렉토리가 있습니다.

$ ls -l
total 899166
drwxr-xr-x 12 me scicomp       324 Jan 24 13:47 data
-rw-r--r--  1 me scicomp     84188 Jan 24 13:47 lod-thin-1.000000-0.010000-0.030000.rda
drwxr-xr-x  2 me scicomp       808 Jan 24 13:47 log
lrwxrwxrwx  1 me scicomp        17 Jan 25 09:41 msg -> /home/me/msg

그리고 를 사용하여 제거하고 싶습니다 rm -r.

그러나 나는 rm -r심볼릭 링크를 따라가서 해당 디렉토리의 모든 것을 삭제할까봐 두렵습니다(이는 매우 나쁩니다).

매뉴얼 페이지에서 이에 대한 내용을 찾을 수 없습니다. rm -rf이 디렉토리 위의 디렉토리에서 실행하는 정확한 동작은 무엇입니까 ?

답변1

예 1: 다른 디렉토리에 대한 소프트 링크가 포함된 디렉토리 삭제.

susam@nifty:~/so$ mkdir foo bar
susam@nifty:~/so$ touch bar/a.txt
susam@nifty:~/so$ ln -s /home/susam/so/bar/ foo/baz
susam@nifty:~/so$ tree
.
├── bar
│   └── a.txt
└── foo
    └── baz -> /home/susam/so/bar/

3 directories, 1 file
susam@nifty:~/so$ rm -r foo
susam@nifty:~/so$ tree
.
└── bar
    └── a.txt

1 directory, 1 file
susam@nifty:~/so$

따라서 우리는 소프트 링크의 대상이 살아남는 것을 볼 수 있습니다.

예 2: 디렉터리에 대한 소프트 링크 삭제

susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
│   └── a.txt
└── baz -> /home/susam/so/bar

2 directories, 1 file
susam@nifty:~/so$ rm -r baz
susam@nifty:~/so$ tree
.
└── bar
    └── a.txt

1 directory, 1 file
susam@nifty:~/so$

단, 소프트링크는 삭제됩니다. 소프트 링크의 대상은 살아남습니다.

예 3: 소프트 링크 대상 삭제 시도

susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
│   └── a.txt
└── baz -> /home/susam/so/bar

2 directories, 1 file
susam@nifty:~/so$ rm -r baz/
rm: cannot remove 'baz/': Not a directory
susam@nifty:~/so$ tree
.
├── bar
└── baz -> /home/susam/so/bar

2 directories, 0 files

심볼릭 링크 대상의 파일은 유지되지 않습니다.

위의 실험은 Debian GNU/Linux 9.0(stretch) 시스템에서 수행되었습니다.

답변2

ls를 실행한 디렉토리를 rm -rf로 입력하면 /home/me/msg 디렉토리가 안전합니다. 심볼릭 링크 자체만 제거되며 심볼릭 링크가 가리키는 디렉토리는 제거되지 않습니다.

내가 조심해야 할 유일한 것은 "rm -rf msg/"(후행 슬래시 포함)와 같은 명령을 호출하는 경우입니다. 그렇게 하면 msg 심볼릭 링크가 아닌 msg가 가리키는 디렉터리가 제거되므로 그렇게 하지 마십시오. 그 자체.

답변3

rm파일과 디렉터리를 제거해야 합니다. 파일이 심볼릭 링크인 경우 대상이 아닌 링크가 제거됩니다. 심볼릭 링크를 해석하지 않습니다. 예를 들어 '깨진 링크'를 삭제할 때의 동작은 무엇이어야 합니까? rm은 실패를 나타내기 위해 0이 아닌 0으로 종료됩니다.

관련 정보