【问题标题】:Recursively delete 0KB files using windows cmd使用windows cmd递归删除0KB文件
【发布时间】:2023-04-03 12:23:01
【问题描述】:

我有一些进程在目录及其子目录中创建一些 0KB 大小的文件。
如何使用 windows 命令提示符从文件系统中删除文件?
任何可以完成任务的单个命令或脚本都可以工作。


我只能在访问受限的远程机器上运行简单的 cmd 命令和脚本。

【问题讨论】:

  • 什么版本的 Windows?许多版本的 Windows 都包含可能更灵活的 VBScript...suite101.com/content/…
  • 我会使用for 来扫描目录树中的文件,findstr 来搜索文件中的“.”。模式并删除那些不匹配的。

标签: windows file cmd


【解决方案1】:

当错字被纠正时,这可以正常工作。问题是缺少波浪号 (~) 例如,del "%%a" 需要为 del "%%~a"

这确实会删除名称中带有空格的文件,因为它将标记括在“双引号”中 - 另一种方法是使用“短名称”,如第二个示例所示 [%%~sa

@echo 关闭 setLocal EnableDelayedExpansion for /f "tokens=* delims=" %%a in ('dir/s/b/a-d') 做 ( if %%~Za equ 0 del "%%~a" )

@echo 关闭 setLocal EnableDelayedExpansion for /f "tokens=* delims=" %%a in ('dir/s/b/a-d') 做 ( 如果 %%~Za equ 0 删除 %%~sa )

【讨论】:

    【解决方案2】:
    @echo off
    setLocal EnableDelayedExpansion
    for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do (
    if %%~Za equ 0 del "%%a"
    )
    

    发现于:link text 似乎有效,但有一个警告:它不会删除名称中包含空格的文件。可能有一种解决方法,但恐怕批处理不是我的强项。

    【讨论】:

    • 好吧,既然您明确声明空格作为标记分隔符for 标记化。我想,del "%%a %%b" 应该可以。但实际的答案是,除非绝对必要(例如,用于排序),否则您永远不应该在 dir 的输出上使用 for /ffor 本身可以迭代文件,并且这样更健壮。例如,如果为控制台窗口选择了光栅字体,您的解决方案将不会处理包含在 OEM 代码页中没有表示的 Unicode 字符的文件名。这些交互很微妙,但我倾向于远离for /f 的文件名
    【解决方案3】:
    1. 递归遍历文件:

      for /r %F in (*)
      
    2. 找出零长度文件:

      if %~zF==0
      
    3. 删除它们:

      del "%F"
      

    把它们放在一起:

    for /r %F in (*) do if %~zF==0 del "%F"
    

    如果您在批处理文件中需要这个,那么您需要将% 加倍:

    for /r %%F in (*) do if %%~zF==0 del "%%F"
    

    注意:我假设您的意思是长度正好为 0 字节的文件。如果使用 0 KB 表示小于 1000 字节,则高于 if 需要读取 if %~zF LSS 1000 或任何您的阈值。

    【讨论】:

    • (为了完整性)相同的命令关闭输出:stackoverflow.com/a/18014912/2436175
    • 如果您想禁止打印每个文件的 if 语句,请使用 @if
    • 我认为这个解决方案的问题是它还会删除非常小的文件而不是空文件。
    • @Foad,if %%~zF==0 只会捕获空文件。
    • @Joey 谢谢。将 del 替换为 acho 然后解释风险可能是个好主意。如果我在自己的计算机上运行此命令,我会丢失很多文件。
    【解决方案4】:

    你可以试试UnxUtils的find.exe。

    find . -type f -empty -delete
    

    【讨论】:

    • 它对这个目的没有用......在远程机器上工作......所以没有直接访问权限。只能运行cmd命令和脚本。
    • 我认为这个答案不应该被否决。它仍然提供了一些有用的信息,可能适用于稍微不同的上下文。投票中和它。
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多