0

为了测试我希望使用的概念,我创建了这个非常简单的批处理文件。我需要递归删除所有一种类型的文件,但具有特定名称的文件夹除外。这是我的代码:

:recur
FOR /f %%a IN ('DIR /b') DO (
IF EXIST %%a\NUL (
    IF ["%%a" NEQ "subtest2"] (
        ECHO %%a
        CD %%a
        CALL :recur
        CD ..
    )
)
COPY "*.cfm" "*_copy.cfm"
REM DEL "*_copy*.cfm"
)

现在我只是在使用复制而不是删除进行测试。基本上,这应该创建所有 .cfm 文件的副本,但文件夹“subtest2”除外。现在它正在递归地在任何地方制作副本,包括 subtest2。我该如何阻止这个?

我的基本目录的结构是:

TestFolder
---subtest1
------test.pdf
------test.txt
------test.cfm
---subtest2
------test.pdf
----- -test.txt
------test.cfm
---test.pdf
---test.txt
---test.cfm
---recur.bat

4

3 回答 3

2

IF比较两边的方括号不平衡,所以永远无法匹配。括号不是 IF 语法的一部分。如果存在,它们只是成为比较字符串的一部分。任何封闭引号也是如此。去掉方括号,就可以了(假设没有其他问题)

这是实现目标的简单方法。出于测试目的,我在 DEL 命令前加上了 ECHO:

for /r /d %%F in (*) do echo %%F\|findstr /liv "\\subtest2\\" >nul && echo del "%%F\*.cfm"

FOR /R /D 只是递归所有文件夹。每个文件夹的完整路径通过管道传送到 FINDSTR 命令中,该命令查找不包含 \subtest2 文件夹的路径。只有在路径中找不到 \subtest2\ 文件夹时,才会执行 ECHO DEL 命令。

确认命令给出正确结果后,删除最后一个 ECHO。

如果要在命令行而不是批处理文件中运行命令,请更改%%F为。%F

于 2013-05-29T20:01:01.107 回答
1
for f in `find . -path YOURDIR -prune -o print`
  do
    rm whateveryouwanttodelete
  done

反引号中的find命令会查找所有文件,但会忽略您要忽略的目录 -prune。然后在循环体中对文件进行核对。你可以做得更好

find . -path YOURDIR -prune -o -print0 | xargs -0 rm -f

不需要循环。免责声明:我没有测试过它,所以也许你想用 cp 而不是 rm 开始采用它。

于 2013-05-29T17:27:29.820 回答
1

你可以试试这个:

@echo off&setlocal
for /r /d %%i in (*) do (
    pushd "%%i"
    echo(%%i|findstr /ri "\\subtest2$" || COPY "*.cfm" "*_copy.cfm"
    popd
)
于 2013-05-29T17:27:31.633 回答