22
votes

I have some process which creates some files of 0KB size in a directory and its sub-directories.
How can I delete the files from the file system using the windows command prompt?
Any single command or a script that will do the task will work.


I can only run simple cmd commands and scripts, working on a remote machine with restricted access.
4
What version of Windows? Many versions of Windows include VBScript which might be more flexible... suite101.com/content/…Klinky
I would use for to scan dir tree for files, findstr to search files for "." pattern and delete those non-matching.Constantin

4 Answers

51
votes
  1. Iterate recursively over the files:

    for /r %F in (*)
    
  2. Find out zero-length files:

    if %~zF==0
    
  3. Delete them:

    del "%F"
    

Putting it all together:

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

If you need this in a batch file, then you need to double the %:

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

Note: I was assuming that you meant files of exactly 0 Bytes in length. If with 0 KB you mean anything less than 1000 bytes, then above if needs to read if %~zF LSS 1000 or whatever your threshold is.

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

Found at : link text seems to work, with one caveat: It won't delete files with names containing spaces. There may be a work-around, but I'm afraid batch is not my forte.

0
votes

This works fine when a typo is corrected. The problem was a missing tilde (~) e.g., del "%%a" needs to be del "%%~a"

This will indeed delete files with spaces in the name because it encloses the token in "double quotes" - an alternate method would be to use 'short name' as shown in the second example [ %%~sa

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

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

-1
votes

You can try find.exe from the UnxUtils.

find . -type f -empty -delete