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


72

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

$ 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 -rsymlink를 따라 가고 그 디렉토리의 모든 것을 삭제한다는 것이 무서워합니다 (매우 나쁩니다).

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


16
더미 파일을 가리키는 심볼릭 링크로 더미 디렉토리를 만들고 시나리오를 실행하는 것이 얼마나 어려운가요? 그럼 당신은 그것이 어떻게 작동하는지 확실히 알게 될 것입니다!

답변:


57

예 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

기호 링크 대상의 파일이 유지되지 않습니다.

위의 실험은 데비안 GNU / 리눅스 9.0 (스트레치) 시스템에서 수행되었습니다.


12
rm -rf baz / *는 내용을 제거합니다
Wyrmwood

2
예, rm -rf [symlink]를 수행하면 원래 디렉토리의 내용이 없어집니다! 정말 조심하세요.
Buttle Butkus

@frnknstn 당신이 맞아요. 최신 데비안 시스템에서 언급 한 것과 같은 동작을 봅니다. 이전 실험을 수행 한 데비안 버전을 기억하지 못합니다. 이전 버전의 데비안에서의 이전 실험에서 a.txt는 세 번째 예에서 살아 남았거나 실험에서 오류가 발생했을 것입니다. 데비안 9에서 관찰 한 현재 동작으로 답변을 업데이트했으며이 동작은 언급 한 내용과 일치합니다.
Susam Pal

19

ls를 실행 한 디렉토리를 rm -rf로 지정하면 / home / me / msg 디렉토리가 안전합니다. 가리키는 링크가 아닌 심볼릭 링크 만 제거됩니다.

내가주의해야 할 유일한 것은 "rm -rf msg /"와 같은 것을 호출하는 것입니다 (후행 슬래시 포함). msg symlink가 아닌 msg가 가리키는 디렉토리를 제거하므로 그렇게하지 마십시오. 그 자체.


3
"내가주의해야 할 유일한 것은"rm -rf msg / "(후행 슬래시 포함)와 같은 것을 호출 한 경우입니다. msg가 아닌 msg가 가리키는 디렉토리를 제거하기 때문에 그렇게하지 마십시오. symlink 자체. " -사실이 아닌 것 같습니다. 아래 답변에서 세 번째 예를 참조하십시오.

1
@Susam ( 'rm -r symlink /'는 symlink의 대상을 삭제하지 않습니다)과 동일한 결과를 얻습니다. 매우 쉬운 실수이므로 기뻐합니다.
Andrew Crabb

5

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

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