2014-08-28 106 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 
)