Copiei um diretório com cp -as /media/user/dir symlinks
e agora estou apavorado rm -rf symlinks
, pois pode excluir arquivos em/media/user/dir
Qual é a maneira segura de excluir apenas a estrutura de diretórios e os links simbólicos symlinks
sem tocar em nada /media/user/dir
?
Como teste, fiz assim:
$ mkdir test
$ touch test/file
$ mkdir test/dir
$ touch test/dir/file2
$ cp -as test syms
$ rm -rf syms
Este teste não tocou no test
diretório original. Este é um teste completo? É sempre assim?
Não tenho espaço para fazer um backup de/media/user/dir
Você pode remover o diretório que contém os links simbólicos sem medo de que isso também remova os arquivos originais.
A especificação POSIX para o
rm
utilitário diz (sobre o que acontece ao encontrar um link simbólico):E então, um pouco mais tarde (na seção Racional):
O manual GNU
rm
não diz nada sobre isso, mas devemos assumir que ele não rompe com o POSIX nesse sentido. O manual de outros sistemas às vezes contém essa promessa explicitamente. Aqui está o OpenBSD (FreeBSD e NetBSD têm palavras idênticas):... e do AIX (Solaris tem uma redação semelhante):
Observe que o comportamento de
rm
em relação a links simbólicos pode ser testado facilmente localmente:Um exercício semelhante pode ser realizado para links simbólicos em um diretório.
Aqui está uma maneira de ganhar confiança sobre o processo de exclusão:
Crie uma configuração de teste (por exemplo, ./Delete_test/) com diretórios, links simbólicos e arquivos regulares dentro dela.
Em seguida, CD para essa configuração de teste.
Agora execute
strace rm -rf ./* 2> /tmp/strace.rm
e capture a saída.Verifique
/tmp/strace.rm
comvim
ougrep
e procure por strings como fstat e unlink; Ele deve mostrar chamadas de sistema para algo comofstatat
andunlinkat
; Você também deve verAT_SYMLINK_NOFOLLOW
&AT_FDCWD
. Isso significa "Não siga links simbólicos" e "Use CWD"; Isso deve informar que, no caso de links simbólicos, os diretórios e arquivos originais não estarão envolvidos no processo de exclusão e estarão seguros.Algumas Referências:
https://linux.die.net/man/2/unlink
https://linux.die.net/man/2/unlinkat
https://linux.die.net/man/2/fstat
https: //linux.die.net/man/2/fstatat