在 Windows 中递归删除目录(除了某些文件)

在 Windows 中递归删除目录(除了某些文件)

在 Windows 中,我需要递归删除目录,只保留一小部分文件。这些文件可能嵌套在子目录中。

我尝试在运行“rmdir /s”之前将文件设为只读,但不起作用。只读文件不能直接删除,但在使用“rmdir /s”删除的子目录中时,它们会被删除。

还有其他想法吗?

答案1

据我所知,你真的不能同时做到这两点——要么删除是递归的(一切都删除),要么删除不是递归的(你明确列出你想要删除的内容)。

您尝试的那种只读技巧在 Unix 系统上起作用的唯一原因是故障/错误会沿着树向上传播(您无法删除仍然有子项的东西),并且从您的测试来看,Windows 对此不太讲究。

答案2

  1. 搜索所需文件。
  2. 找到后,将所需的文件/文件夹树复制到临时位置。
    • 具有正确选项的 Robocopy 可以保留属性和时间戳。
  3. 删除目录。
  4. 将文件/文件夹树复制回原始位置。
  5. ...?
  6. 利润!

比我更优秀的脚本编写者可能只需几行代码就能自动完成整个过程,甚至使用 robocopy。我首先想到的是,也许你可以复制出所需的文件列表,然后使用该/MIR选项删除原始目录中不在目标目录中的所有内容。

答案3

我能够使用一些批处理代码来完成此操作,但是它相当长:

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
)

答案4

隐藏文件不会被删除。

  1. attrib +h 表示不删除文件
  2. 删除所有文件
  3. 删除空目录
  4. attrib +h 已保存的文件。

容量:

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"

相关内容