Recursively delete 0KB files using windows cmd

2019-01-17 07:05发布

问题:

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.

回答1:

  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:

@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.



回答3:

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 )



回答4:

You can try find.exe from the UnxUtils.

find . -type f -empty -delete


标签: windows file cmd