(批处理)如何递归删除目录中除了具有前导的文件/文件夹之外的所有文件/文件夹。?

时间:2018-05-14 08:29:30

标签: windows batch-file command-line pattern-matching

我有一个目录src。我想以递归方式删除除文件(.gitignore,...)和文件夹(.git.vscode,...)以外的所有内容,其名称以{{1}开头}。在子目录中匹配该模式既不必要也不有害。

在批处理文件中执行此操作的最简洁方法是什么?

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"

:: step 1 : delete all files NOT starting "."

FOR /f "tokens=1*delims=" %%a IN (
 'dir /s /b /a-d "%sourcedir%\*" '
 ) DO (
 ECHO %%~nxa|FINDSTR /b /L "." >nul
 IF ERRORLEVEL 1 ECHO(DEL "%%a"
)

:: step 2 : delete all directories NOT starting "."

FOR /f "tokens=1*delims=" %%a IN (
 'dir /s /b /ad "%sourcedir%\*" ^|sort /r'
 ) DO (
 ECHO %%~nxa|FINDSTR /b /L "." >nul
 IF ERRORLEVEL 1 ECHO(RD "%%a"
)
GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

为了测试目的,所需的DEL命令仅为ECHO在您确认命令正确后,将ECHO(DEL更改为DEL以实际删除文件。

所需的RD命令仅用于ECHO以用于测试目的。 在您确认命令正确后,将ECHO(RD更改为RD以实际删除目录。

对于整个子树中的每个文件名,查看它是以.开头,如果没有,则将errorlevel设置为非0,从而删除该文件。

完成此操作后,使用目录名重复该操作,但对反向找到的名称进行排序,以便任何目录的子目录名将出现在目录名之前。 尝试删除带有rd的目录 - 如果它包含文件或子目录(隐式启动.),它将保留。将2>nul附加到rd行以禁止显示错误消息(无法删除目录,因为它仍包含文件/子目录)

答案 1 :(得分:0)

尝试此操作以排除带有前导点的文件夹(在每个文件夹基础上):

for /f "tokens=*eol=." %%A in ('dir /B /AD') do Echo=%%A

这不会影响在其他位置包含点的文件夹名称。

相对较慢的变体递归所有文件夹并使用findstr过滤包含\.的所有文件夹,这两个字符都需要使用反斜杠转义

for /r /D %%A in (*) do @echo %%A|findstr /V "\\\."