Exclui recursivamente o diretório, exceto alguns arquivos no Windows

2

No Windows, eu preciso excluir recursivamente um diretório, exceto por uma pequena lista de arquivos a serem mantidos. Os arquivos podem estar aninhados em subdiretórios.

Eu tentei tornar os arquivos somente leitura antes de executar o "rmdir / s", mas isso não funciona. Os arquivos somente leitura não podem ser excluídos diretamente, mas são excluídos quando dentro de um subdiretório que está sendo excluído com "rmdir / s".

Alguma outra ideia?

    
por Mike Harder 10.11.2012 / 08:36

4 respostas

1

Consegui fazer isso com algum código de lote, mas é bastante longo:

setlocal enabledelayedexpansion

:: Delete files not containing "foo"
for /r MyDir %%i in (*) do (
  set temp=%%~nxi
  if "!temp:foo=!"=="!temp!" (
    del "%%i"
  )
)

:: Build recursive list of dirs, sorted by deepest first
set dirs=
for /r MyDir /d %%i in (*) do (
  set dirs="%%i" !dirs!
)

:: Delete dirs.  Nonempty dirs will be skipped.
for %%i in (%dirs%) do (
  rmdir %%i
)
    
por 06.02.2013 / 02:24
1

Até onde eu sei, você realmente não pode ter as duas coisas - ou a exclusão é recursiva (tudo funciona) ou não é recursiva (você lista explicitamente o que deseja).

A única razão pela qual o truque de somente leitura que você tentou trabalhar em sistemas Unix é porque a falha / erro se propaga na árvore (você não pode excluir algo que ainda tem filhos), e pareceria do seu teste que O Windows é menos específico sobre isso.

    
por 10.11.2012 / 09:20
1
  1. Pesquise os arquivos desejados.
  2. Quando encontrado, copie os arquivos / árvore de pastas desejados para o local temporário.
    • Robocopy com as opções corretas pode preservar atributos e carimbos de hora.
  3. Excluir o diretório.
  4. Copiar arquivos / árvore de pastas de volta ao local original.
  5. ...?
  6. Lucro!

Um roteirista melhor do que eu provavelmente poderia automatizar tudo em poucas linhas, usando até mesmo o robocopy. No topo da minha cabeça, eu estou pensando talvez você copie a lista de arquivos que você quer e use a opção /MIR para apagar tudo no diretório original que não está no diretório de destino.

    
por 11.11.2012 / 05:14
-1

Os arquivos ocultos não são excluídos.

  1. attrib + h para os arquivos não serem excluídos
  2. excluir todos os arquivos
  3. del os diretórios vazios
  4. atrib + h os arquivos salvos.

Vg:

for /f "delims=" %i in ('dir "My Dir\*.log" /b /s') do attrib +h "%i"
for /f "delims=" %i in ('dir "My Dir" /b /s') do del "%i" /q
rmdir /s
for /f "delims=" %i in ('dir "My Dir" /b /s /ah') do attrib -h "%i"
    
por 12.11.2012 / 16:03

Tags