【问题标题】:How can I delete files that don't match a wildcard?如何删除与通配符不匹配的文件?
【发布时间】:2011-06-25 18:09:06
【问题描述】:

例如,我可以使用以下通配符删除所有 .exe 文件:

del *.exe

我该如何做相反的事情,即删除所有.exe结尾的文件?

【问题讨论】:

    标签: batch-file wildcard


    【解决方案1】:

    没有直接的方法,这是一种无脚本的方法:

    1. 创建一个子目录。
    2. 将所有*.exe*文件复制到子目录中。
    3. 删除当前目录中的所有文件 (*.*)。
    4. 将子目录中的所有文件复制到当前目录。
    5. 删除子目录中的所有文件。
    6. 删除 (rmdir) 子目录

    这是代码:

    C:\mydir> mkdir temp
    C:\mydir> move *.exe temp
    C:\mydir> del *.* /f /q
    C:\mydir> move temp\*.exe .
    C:\mydir> rmdir temp
    

    【讨论】:

    • 如果您按照此操作并执行del *.* /f /s,您也会删除 temp 中的文件(由于 /s 参数)
    • @Nyu 这就是为什么你不应该在别人的帖子中添加代码
    【解决方案2】:

    不知道这是否适合您(取决于您的目录中是否有其他只读文件),但这应该可以:

    attrib +R *.exe
    del *.*
    attrib -R *.exe
    

    关于您的问题,DOS 默认命令中没有“排除”通配符之类的东西

    【讨论】:

    • 如果该属性已经设置了怎么办?现在你只是错误地清除了属性。
    • 对,正如我所说,取决于具体情况...... aruseni 的解决方案更优雅:-)
    【解决方案3】:

    你可以试试这个。

    FOR /R [directory] %%F IN (*.*) DO IF NOT "%%~xF" == ".[extension]" DEL /F /S "%%F"
    

    或者,如果你只有一个 .exe 文件,那就更简单了。

    for %i in (*.*) do if not %i == FILE.EXE del %i
    

    【讨论】:

    • 我也需要学习更难的方法(实际上并不难),所以你得到了复选标记。 :)
    • 谢谢。我在 FreeDOS 中检查了这两个解决方案(在 VirtualBox 中运行,因为我的 PC 运行 Linux),第二个有效(但它仍然适用于一个文件)。关于第一个——看起来它只适用于 Windows 2000 和 XP。更多信息请点击此处:computerhope.com/forhlp.htm
    【解决方案4】:

    为了增强问题的响应(关于排除通配符):如果您不搜索特定扩展名,则可以使用此 for 循环:

    for /F "usebackq" %i IN (`dir /b *^|findstr /i /v <PATTERN>`) DO @echo %i
    

    将“echo”替换为“del”...

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 2022-11-19
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多