2014-08-28 142 views
0

我有一个有10个子目录的目录。这些文件都包含不同的.bak文件。我试图创建一个脚本来检查是否有X个文件存在,如果文件数量超过X,它将删除最旧的文件。换句话说,我需要20个.bak文件的迭代。当第21个出现时,我想让批处理文件删除最早的文件。 这可能吗? 如果是这样,我可以创建一个查看所有子目录的单个脚本吗? 在此先感谢。文件保留脚本

+0

文件数量不应超过子目录中的数量还是所有文件的数量? – npocmaka 2014-08-29 07:34:58

回答

0

假定您要检查父目录中的文件数。也可以为每个子目录完成。

@echo off 
setlocal 

set "max_number_files=20" 
set "parrent_dir=c:\whatever_you_need" 
set "extension=.bak" 

pushd "%parrent_dir%" 
set "count=0" 

setlocal enableDelayedExpansion 
for /f "delims=" %%a in ('dir /s /b /a:-d /o:-d /t:c *%extension%') do (
    set /a count=count+1 
    if 1!count! GTR 1!max_number_files! (
     rem --- remove the echo to activate deletion 
     echo del /q /f "%%~a" 
    ) 
) 
popd 
endlocal 
endlocal 
1

包括两个选项。第一个将在每个文件夹下留下%maxFiles%bak文件。第二个(Vista或更高版本的操作系统需要为ROBOCOPY窗口来获取文件的排序列表)将离开%maxFiles%

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "rootFolder=%cd%" 
    set "maxFiles=20" 

    rem Option 1 - Keep %maxFiles% inside each of the subfolders 
    for /d /r "%rootFolder%" %%z in (*) do for /f "skip=%maxFiles% delims=" %%a in (
     'dir /tc /o-d /a-d /b "%%~fz\*.bak" 2^>nul' 
    ) do echo del "%%~fz\%%~nxa" 

    echo ------------------------------ 

    rem Option 2 - Keep %maxFiles% in total under all the subfolders 
    for /f "skip=%maxFiles% tokens=2,*" %%a in (' 
     robocopy "%rootFolder%" "%rootFolder%" *.bak /l /nocopy /is /s /njh /njs /ndl /nc /ns /ts 
     ^| findstr /v /r /e /i /c:"%rootFolder:\=\\%\\[^\\]*" 
     ^| sort /r 
    ') do echo del "%%b" 

del命令只回显到控制台。如果输出是正确的,去掉echo命令来删除文件

0

这将检查d:\base\folder下的每个文件夹,如果有超过20个*.bak文件它将删除最早的所以只有20 * .bak文件依然存在,每个文件夹。

在一些示例文件夹上测试它。

@echo off 
for /d /r "d:\base\folder" %%a in (*) do (
    pushd "%%a" 
     for /f "skip=20 delims=" %%b in ('dir /b /a-d /o:-d *.bak ') do del "%%b" 
    popd 
)