删除小于特定大小的文件

时间:2011-07-20 15:40:49

标签: windows batch-file cmd

我想删除目录中小于特定大小的所有文件。有谁知道是否有Windows命令会这样做?像del *.* where size<3kb

这样的东西

我目前正在这样做:

for /F %%A in ("*.pdf") do If %%~zA LSS 20103409 del %%~fA

我获得的输出是:

C:\Documents and Settings\agordon\Desktop\test>If 6440450 LSS 20103409 del C:\Do
cuments and Settings\agordon\Desktop\test\US Tox 01-06-11.pdf
The system cannot find the path specified.

...即使PDF文件小到可以删除。

我做错了什么?

这实际上有效:

FOR %%F IN (*.pdf) DO (
IF %%~zF LSS 20103409  DEL %%F
)

但是它没有识别文件名,因为它们有空格!如何在该脚本中将Windows名称转换为“DOS”名称?例如,Windows名称为file name.pdf我可能需要转换为“DOS”,它看起来像file_name.pdf或类似的东西。

6 个答案:

答案 0 :(得分:10)

从批处理脚本中尝试:

@echo off
setlocal
for /f  "usebackq delims=;" %%A in (`dir /b *.pdf`) do If %%~zA LSS 3145728 del "%%A"

答案 1 :(得分:1)

好的,所以我在cmd脚本中使用了AtomicParsley,使用--overWrite选项将图稿添加到400多个子文件夹中的所有MP4电影中。它有时barfs和orignal文件留下不到2k。我需要一种方法来找到所有这些混乱的MP4文件,以便我可以重新下载它们。

这是我在命令行中使用的使用Mrchief的例子,它就像在Windows 7中的魅力一样。

@for /f  "usebackq delims=;" %A in (`dir /s /b *.mp4`) do @If %~zA LSS 2048 echo "%A"

这是处理32个文件后的输出

    D:\Movie>@for /f  "usebackq delims=;" %A in (`dir /s /b *.mp4`) do @If %~zA LSS 2048 echo "%A"
    "D:\Movie\Action\Deadland (2009)\Deadland (2009).mp4"
    "D:\Movie\Science Fiction\Alien3 (1992)\Alien3 (1992).mp4"

    D:\Movie> 

你可以用del替换echo并更改2048以搜索不同的大小。

答案 2 :(得分:1)

BTW:对我来说,使用PowerShell(在Windows 10上)更简单:

我只在我希望删除小于20MB的文件的目录上执行此操作:

ls | where {$_.Length -lt 20mb} | Remove-Item

答案 3 :(得分:0)

以下是使用robocopy及其过滤功能的不同方法。以下是在命令提示符窗口中输入File Selection Options时显示的robocopy /?的摘录:

             /MAX:n :: MAXimum file size - exclude files bigger than n bytes.
             /MIN:n :: MINimum file size - exclude files smaller than n bytes.

          /MAXAGE:n :: MAXimum file AGE - exclude files older than n days/date.
          /MINAGE:n :: MINimum file AGE - exclude files newer than n days/date.
          /MAXLAD:n :: MAXimum Last Access Date - exclude files unused since n.
          /MINLAD:n :: MINimum Last Access Date - exclude files used since n.
                       (If n < 1900 then n = n days, else n = YYYYMMDD date).

因此,可以在此处应用/MIN/MAX选项。由于我们不想复制任何文件,因此使用/L选项列出将在没有切换的情况下复制的所有项目,然后通过for /F循环解析返回的列表,该循环保留实际删除命令del在身体中:

set "TARGETDIR=."
set "FILES=*.pdf"
for /F "tokens=*" %%F in ('
    robocopy "%TARGETDIR%" "%TARGETDIR%" "%FILES%" ^
        /L /IS /FP /NC /NS /NDL /NP /NJH /NJS ^
        /MIN:0 /MAX:3071
') do (
    ECHO del "%%F"
)

完成测试后,从脚本中删除大写ECHO以实际删除文件。

除了/MIN/MAX/L之外,robocopy命令行中还定义了其他几个选项,其中大部分都关注所需的输出,即简单匹配文件的完整路径列表,没有任何额外信息,如页眉,页脚或摘要。

源目录和目标目录都设置为目标目录。通常情况下这不起作用(你不能将文件复制到自己身上),但是由于声明了/L,所以生成了文件列表,但仅当交换/IS时也是如此(意味着“相同的文件“应被视为”。

答案 4 :(得分:-2)

我不确定如何从DOS中执行此操作,但这是我们过去使用的内容;它使用VBScript,因此你可以调用这个filesoversize.vbs。

Dim strPath
Dim lngSize

Dim fso
Dim fold
Dim files
Dim file

lngSize = 10000 ' The threshold in bytes (this is 100k)
strPath = "C:\temp\" 'The folder you want to start in

Set fso = CreateObject("scripting.filesystemobject")
Set fold = fso.GetFolder(strPath)
Set files = fold.files

For Each file In files
    If file.Size <= lngSize Then file.Delete True
Next

答案 5 :(得分:-3)

Del命令中没有可以根据文件大小删除文件的开关。