O NTFS suporta todos os tipos de links, incluindo junções, links físicos, links flexíveis, etc. então aqui está um problema.
Digamos que você esteja excluindo recursivamente um diretório que realmente contém as coisas acima. É fácil imaginar que seu aplicativo, seja o que for, em vez de excluir todas as junções, links virtuais que podem levar para fora do diretório em que você está interessado , etc., os atravessa e primeiro exclui todos os arquivos dentro.
Isso pode facilmente levar a uma grande perda de dados.
Aqui está um exemplo simples. Você monta uma unidade de disco rígido que possui outra instalação do Windows.
Vamos verificar o conteúdo de D:\ProgramData
:
D:\ProgramData>dir /a
Volume in drive D has no label.
Volume Serial Number is 1234-4321
Directory of D:\ProgramData
12/06/2021 12:56 PM <DIR> .
12/06/2021 12:56 PM <DIR> ..
07/14/2009 10:08 AM <JUNCTION> Application Data [C:\ProgramData]
07/14/2009 10:08 AM <JUNCTION> Desktop [C:\Users\Public\Desktop]
07/14/2009 10:08 AM <JUNCTION> Documents [C:\Users\Public\Documents]
07/14/2009 10:08 AM <JUNCTION> Favorites [C:\Users\Public\Favorites]
02/11/2016 03:51 PM <DIR> Microsoft
07/10/2019 03:00 AM <DIR> Microsoft Help
12/23/2019 04:04 PM <DIR> Package Cache
07/14/2009 10:08 AM <JUNCTION> Start Menu [C:\ProgramData\Microsoft\Windows\Start Menu]
07/14/2009 10:08 AM <JUNCTION> Templates [C:\ProgramData\Microsoft\Windows\Templates]
Agora, e se você tentar excluir recursivamente D:\ProgramData
? Eu nem vou tentar fazer isso porque tenho medo de C:\ProgramData
ser excluído primeiro.
No Linux rm -rf
lida com isso perfeitamente - ele vê links simbólicos (para diretórios) e exclui links simbólicos como arquivos, sem tentar percorrê-los.
Qual é a maneira segura de excluir recursivamente esses diretórios no Windows?
rmdir /q /s
? Algo mais?
rmdir excluirá o link simbólico.
del excluirá o destino dos links, mas não o link.
rmdir /S /Q
excluirá o diretório recursivamente e não seguirá links simbólicos.Testei e confirmei o comportamento com cmd no Windows 10:
De acordo com este comentário , o rmdir se comportará de maneira diferente se invocado do powershell do que do cmd, mas não testei com o powershell.
Para excluir todos os arquivos que não são uma junção, este comando deve fazê-lo:
Onde:
/s
: recurso/a:-l
: apenas arquivos que não são pontos de nova análiseOs pontos de nova análise de NTFS incluem junções de diretório, links simbólicos e pontos de montagem de volume.
Um pequeno teste do que será deletado pode ser feito usando o comando:
(Eu ainda faria um backup da pasta se for importante.)
Tentei com rmdir /s no prompt de comando
Eu criei um diretório c:\abc1 com um arquivo de texto nele.
E criei um diretório c:\test1 com um subdiretório c:\test1\blah
Dentro de c:\test1\blah tentei criar links para c:\abc1 , um link simbólico ou um link de junção.
Então, quando fiz rmdir /s em blah, verifiquei c:\abc1 e ainda está lá com seu conteúdo.
Portanto, rmdir /s do prompt do cmd, testado no Windows 7, é seguro.
Realmente você deve ser capaz de fazer o teste sozinho com muita facilidade.
Um comentário menciona que o powershell rmdir é diferente .. Não posso comentar muito sobre o powershell, não o uso muito. Vejo que o rmdir do powershell fornece uma saída diferente, por exemplo, rmdir diz "cmdlet Remove-Item no pipeline de comando ...", então parece ser muito diferente do cmd, não estou familiarizado com ele.