我有一个目录src
。我想以递归方式删除除文件(.gitignore
,...)和文件夹(.git
,.vscode
,...)以外的所有内容,其名称以{{1}开头}。在子目录中匹配该模式既不必要也不有害。
在批处理文件中执行此操作的最简洁方法是什么?
答案 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 "\\\."