O rm-rf segue links simbólicos?

63

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 que rm -r siga o link simbólico e apague tudo nesse diretório (o que é muito ruim).

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

    
por Greg 25.01.2012 / 17:39

3 respostas

51

Exemplo 1: Excluindo um diretório contendo um link 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$

Então, vemos que o alvo do link soft sobrevive.

Exemplo 2: excluir um link de software 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$

Apenas o link flexível é excluído. O alvo do soft-link sobrevive.

Exemplo 3: tentativa de excluir o alvo de um link físico

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).

    
por 25.01.2012 / 17:47
19

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

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

    
por 25.01.2012 / 17:43
5

rm deve 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 quando a exclusão de 'links quebrados' rm sair com 0 não com zero diferente para indicar falha

    
por 26.01.2012 / 05:42