Rm -rf segue links simbólicos?

72

Eu tenho um diretório como este:

$ 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

E eu quero removê-lo usando rm -r.

No entanto, estou com medo de rm -rseguir o link simbólico e excluir tudo o que estiver nesse diretório (o que é muito ruim).

Não consigo encontrar nada sobre isso nas páginas de manual. Qual seria o comportamento exato da execução rm -rfde um diretório acima deste?

Greg
fonte
16
Quão difícil é criar um diretório fictício com um link simbólico apontando para um arquivo fictício e executar o cenário? Então você saberá com certeza como funciona!

Respostas:

57

Exemplo 1: Excluindo um diretório que contém um link flexível para outro diretório.

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$

Portanto, vemos que o alvo do link virtual sobrevive.

Exemplo 2: Excluindo um Link Direto para um Diretório

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$

Somente o link virtual é excluído. O alvo do link virtual sobrevive.

Exemplo 3: Tentativa de excluir o destino de um link virtual

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

O arquivo no destino do link simbólico não sobrevive.

Os experimentos acima foram feitos em um sistema Debian GNU / Linux 9.0 (stretch).

Susam Pal
fonte
12
rm -rf baz / * irá remover o conteúdo
Wyrmwood
2
Sim, se você fizer rm -rf [link simbólico], o conteúdo do diretório original será apagado! Tenha muito cuidado.
Buttle Butkus
@frnknstn Você está certo. Eu vejo o mesmo comportamento que você mencionou no meu mais recente sistema Debian. Não me lembro em qual versão do Debian realizei os experimentos anteriores. Nos meus experimentos anteriores em uma versão mais antiga do Debian, o a.txt deve ter sobrevivido no terceiro exemplo ou eu devo ter cometido um erro no meu experimento. Atualizei a resposta com o comportamento atual que observo no Debian 9 e esse comportamento é consistente com o que você mencionou.
Susam Pal
19

Seu diretório / home / me / msg estará seguro se você rm -rf o diretório a partir do qual você executou ls. Somente o link simbólico será removido, não o diretório para o qual ele aponta.

A única coisa com a qual eu seria cauteloso seria se você chamasse algo como "rm -rf msg /" (com a barra à direita). Não faça isso porque removerá o diretório para o qual a mensagem aponta, em vez do link simbólico da mensagem em si.

Ken Simon
fonte
3
"A única coisa com a qual eu seria cauteloso seria se você chamasse algo como" rm -rf msg / "(com a barra à direita). Não faça isso porque removerá o diretório para o qual a mensagem aponta, em vez da mensagem link simbólico ". - Eu não acho isso verdade. Veja o terceiro exemplo na minha resposta abaixo.
11
Eu obtenho o mesmo resultado que @Susam ('rm -r symlink /' não exclui o destino do link simbólico), o que me agrada, pois seria um erro muito fácil de cometer.
idoimaging
5

rmdeve remover arquivos e diretórios. Se o arquivo for um link simbólico, o link será removido, não o destino. Não interpretará um link simbólico. Por exemplo, qual deve ser o comportamento ao excluir 'links quebrados' - a saída da empresa com 0 não com diferente de zero para indicar falha

Jayan
fonte