AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1694686
Accepted
Artem S. Tashkinov
Artem S. Tashkinov
Asked: 2021-12-18 17:51:11 +0800 CST2021-12-18 17:51:11 +0800 CST 2021-12-18 17:51:11 +0800 CST

Como excluir recursivamente com segurança um diretório no Windows?

  • 772

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:\ProgramDataser excluído primeiro.

No Linux rm -rflida 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?

symbolic-link ntfs
  • 3 3 respostas
  • 306 Views

3 respostas

  • Voted
  1. mashuptwice
    2021-12-21T06:02:16+08:002021-12-21T06:02:16+08:00

    rmdir excluirá o link simbólico.

    del excluirá o destino dos links, mas não o link.

    rmdir /S /Qexcluirá o diretório recursivamente e não seguirá links simbólicos.

    Testei e confirmei o comportamento com cmd no Windows 10:

    #create directory structure
    C:\Users\username\test>mkdir 1 2 3
    
    C:\Users\username\test>mkdir 1\testdir
    
    C:\Users\username\test>mkdir 1\testdir\1
    
    #create symbolic link to directory
    
    C:\Users\username\test>mklink /D testlink 1\testdir\1
    symbolische Verknüpfung erstellt für testlink <<===>> 1\testdir\1
    
    
    C:\Users\username\test>dir
    
     Verzeichnis von C:\Users\username\test
    
    28.12.2021  20:24    <DIR>          .
    28.12.2021  20:24    <DIR>          ..
    28.12.2021  20:23    <DIR>          1
    28.12.2021  20:23    <DIR>          2
    28.12.2021  20:23    <DIR>          3
    28.12.2021  20:24    <SYMLINKD>     testlink [1\testdir\1]
                   0 Datei(en),              0 Bytes
                   6 Verzeichnis(se), 22.185.267.200 Bytes frei
    
    #test rmdir with the named parameters
    C:\Users\username\test>rmdir /s /q testlink
    
    C:\Users\username\test>dir
    
     Verzeichnis von C:\Users\username\test
    
    28.12.2021  20:25    <DIR>          .
    28.12.2021  20:25    <DIR>          ..
    28.12.2021  20:23    <DIR>          1
    28.12.2021  20:23    <DIR>          2
    28.12.2021  20:23    <DIR>          3
                   0 Datei(en),              0 Bytes
                   5 Verzeichnis(se), 22.185.267.200 Bytes frei
    
    
    
    C:\Users\username\test>cd 1\testdir\
    
    #obviously the subdirectory in the linked-to directory is still there
    C:\Users\username\test\1\testdir>dir
    
    
     Verzeichnis von C:\Users\username\test\1\testdir
    
    28.12.2021  20:23    <DIR>          .
    28.12.2021  20:23    <DIR>          ..
    28.12.2021  20:24    <DIR>          1
                   0 Datei(en),              0 Bytes
                   3 Verzeichnis(se), 22.184.206.336 Bytes frei
    

    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.

    • 2
  2. harrymc
    2021-12-21T09:45:16+08:002021-12-21T09:45:16+08:00

    Para excluir todos os arquivos que não são uma junção, este comando deve fazê-lo:

    del /s /a:-l
    

    Onde:

    • /s: recurso
    • /a:-l: apenas arquivos que não são pontos de nova análise

    Os 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:

    dir /s /a:-l
    

    (Eu ainda faria um backup da pasta se for importante.)

    • 2
  3. Best Answer
    barlop
    2021-12-29T11:59:21+08:002021-12-29T11:59:21+08:00

    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.

    C:\>dir c:\abc1
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of c:\abc1
    
    28/12/2021  19:45    <DIR>          .
    28/12/2021  19:45    <DIR>          ..
    28/12/2021  19:45                 6 a.txt
                   1 File(s)              6 bytes
                   2 Dir(s)  137,425,338,368 bytes free
    
    C:\>cd test
    The system cannot find the path specified.
    
    C:\>cd test1
    
    C:\test1>dir
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of C:\test1
    
    28/12/2021  19:45    <DIR>          .
    28/12/2021  19:45    <DIR>          ..
    28/12/2021  19:46    <DIR>          blah
                   0 File(s)              0 bytes
                   3 Dir(s)  137,425,338,368 bytes free
    
    C:\test1>cd blah
    
    C:\test1\blah>dir
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of C:\test1\blah
    
    28/12/2021  19:46    <DIR>          .
    28/12/2021  19:46    <DIR>          ..
                   0 File(s)              0 bytes
                   2 Dir(s)  137,425,338,368 bytes free
    
    C:\test1\blah>mklink /?
    Creates a symbolic link.
    
    MKLINK [[/D] | [/H] | [/J]] Link Target
    
            /D      Creates a directory symbolic link.  Default is a file
                    symbolic link.
            /H      Creates a hard link instead of a symbolic link.
            /J      Creates a Directory Junction.
            Link    specifies the new symbolic link name.
            Target  specifies the path (relative or absolute) that the new link
                    refers to.
    
    C:\test1\blah>mklink /d c:\abc1
    The syntax of the command is incorrect.
    Creates a symbolic link.
    
    MKLINK [[/D] | [/H] | [/J]] Link Target
    
            /D      Creates a directory symbolic link.  Default is a file
                    symbolic link.
            /H      Creates a hard link instead of a symbolic link.
            /J      Creates a Directory Junction.
            Link    specifies the new symbolic link name.
            Target  specifies the path (relative or absolute) that the new link
                    refers to.
    
    C:\test1\blah>mklink /d qq c:\abc1
    symbolic link created for qq <<===>> c:\abc1
    
    C:\test1\blah>dir
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of C:\test1\blah
    
    28/12/2021  19:47    <DIR>          .
    28/12/2021  19:47    <DIR>          ..
    28/12/2021  19:47    <SYMLINKD>     qq [c:\abc1]
                   0 File(s)              0 bytes
                   3 Dir(s)  137,425,469,440 bytes free
    
    C:\test1\blah>dir qq
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of C:\test1\blah\qq
    
    28/12/2021  19:45    <DIR>          .
    28/12/2021  19:45    <DIR>          ..
    28/12/2021  19:45                 6 a.txt
                   1 File(s)              6 bytes
                   2 Dir(s)  137,425,469,440 bytes free
    
    C:\test1\blah>cd ..
    
    C:\test1>rmdir /s blah
    blah, Are you sure (Y/N)? y
    
    C:\test1>dir c:\abc1
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of c:\abc1
    
    28/12/2021  19:45    <DIR>          .
    28/12/2021  19:45    <DIR>          ..
    28/12/2021  19:45                 6 a.txt
                   1 File(s)              6 bytes
                   2 Dir(s)  137,425,379,328 bytes free
    
    C:\test1>cd blah
    The system cannot find the path specified.
    
    C:\test1>md blah
    
    C:\test1>dir
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of C:\test1
    
    28/12/2021  19:47    <DIR>          .
    28/12/2021  19:47    <DIR>          ..
    28/12/2021  19:47    <DIR>          blah
                   0 File(s)              0 bytes
                   3 Dir(s)  137,424,666,624 bytes free
    
    C:\test1>cd blah
    
    C:\test1\blah>dir
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of C:\test1\blah
    
    28/12/2021  19:47    <DIR>          .
    28/12/2021  19:47    <DIR>          ..
                   0 File(s)              0 bytes
                   2 Dir(s)  137,424,666,624 bytes free
    
    C:\test1\blah>mklink /?
    Creates a symbolic link.
    
    MKLINK [[/D] | [/H] | [/J]] Link Target
    
            /D      Creates a directory symbolic link.  Default is a file
                    symbolic link.
            /H      Creates a hard link instead of a symbolic link.
            /J      Creates a Directory Junction.
            Link    specifies the new symbolic link name.
            Target  specifies the path (relative or absolute) that the new link
                    refers to.
    
    C:\test1\blah>mklink /J ww c:\abc1
    Junction created for ww <<===>> c:\abc1
    
    C:\test1\blah>dir
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of C:\test1\blah
    
    28/12/2021  19:48    <DIR>          .
    28/12/2021  19:48    <DIR>          ..
    28/12/2021  19:48    <JUNCTION>     ww [c:\abc1]
                   0 File(s)              0 bytes
                   3 Dir(s)  137,424,715,776 bytes free
    
    C:\test1\blah>dir ww
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of C:\test1\blah\ww
    
    28/12/2021  19:45    <DIR>          .
    28/12/2021  19:45    <DIR>          ..
    28/12/2021  19:45                 6 a.txt
                   1 File(s)              6 bytes
                   2 Dir(s)  137,424,715,776 bytes free
    
    C:\test1\blah>cd ..
    
    C:\test1>rmdir /s blah
    blah, Are you sure (Y/N)? y
    
    C:\test1>dir c:\abc1
     Volume in drive C has no label.
     Volume Serial Number is 4645-5DCE
    
     Directory of c:\abc1
    
    28/12/2021  19:45    <DIR>          .
    28/12/2021  19:45    <DIR>          ..
    28/12/2021  19:45                 6 a.txt
                   1 File(s)              6 bytes
                   2 Dir(s)  137,424,740,352 bytes free
    
    C:\test1>
    

    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.

    • 0

relate perguntas

  • Você pode inicializar o NTFS Flash Drive?

  • Taxa de transferência de arquivos com links simbólicos no WinSCP

  • tar no windows falha ao extrair o link simbólico do arquivo

  • Como criar um script que ouça as alterações de conteúdo e toque nas pastas pai até o fim?

  • Não é possível criar novos arquivos com ":" em seus nomes de arquivo, mas já tenho 13300 deles que funcionam bem (linux, partição ntfs)

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve