在 Windows 中,我需要递归删除目录,只保留一小部分文件。这些文件可能嵌套在子目录中。
我尝试在运行“rmdir /s”之前将文件设为只读,但不起作用。只读文件不能直接删除,但在使用“rmdir /s”删除的子目录中时,它们会被删除。
还有其他想法吗?
答案1
据我所知,你真的不能同时做到这两点——要么删除是递归的(一切都删除),要么删除不是递归的(你明确列出你想要删除的内容)。
您尝试的那种只读技巧在 Unix 系统上起作用的唯一原因是故障/错误会沿着树向上传播(您无法删除仍然有子项的东西),并且从您的测试来看,Windows 对此不太讲究。
答案2
- 搜索所需文件。
- 找到后,将所需的文件/文件夹树复制到临时位置。
- 具有正确选项的 Robocopy 可以保留属性和时间戳。
- 删除目录。
- 将文件/文件夹树复制回原始位置。
- ...?
- 利润!
比我更优秀的脚本编写者可能只需几行代码就能自动完成整个过程,甚至使用 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
隐藏文件不会被删除。
- attrib +h 表示不删除文件
- 删除所有文件
- 删除空目录
- 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"