Windows批处理文件,用于从目录中删除文件,但保留每个目录中的最新文件

时间:2013-11-22 07:34:35

标签: batch-file perforce

我正在尝试编写一个Windows脚本(适用于Win7 / Server 2008),该脚本会删除早于某个日期的文件,同时保留最新的文件,无论年龄大小。

Perforce通过将其封装在目录中来存储服务器或代理上的版本化二进制文件。

例如,如果我将image.jpg存储在服务器上并更新两次,它会将其存储在像“image.jpg,d”这样的目录中,其中包含编号的gzip文件。

e.g。

c:\depot\1\image.jpg,d\123.gz | last modified: 9/1/2013
c:\depot\1\image.jpg,d\124.gz | last modified: 10/1/2013
c:\depot\1\image.jpg,d\125.gz | last modified: 11/1/2013
c:\depot\2\image.jpg,d\123.gz | last modified: 9/1/2013
c:\depot\2\image.jpg,d\124.gz | last modified: 10/1/2013
c:\depot\2\image.jpg,d\125.gz | last modified: 11/1/2013

在这种情况下,如果我为超过14天的文件运行标准forfiles删除脚本,则将删除所有六个文件。我正在寻找一个解决方案,在这种情况下,删除了123.gz和124.gz,但在两个目录中都保留了125.gz。

如果文件夹中有单个文件:

c:\depot\1\hw\images\helloworld.jpg,d\122.gz | last modified 1/1/2013

它将保留文件。如果有多个,则会留下最新的一个。

此解决方案类似,但Win7不成功:How to use forfiles (or similar) to delete files older than n days, but always leaving most recent n

3 个答案:

答案 0 :(得分:0)

"c:\server\folder"更改为基本位置并运行:

该代码旨在将最新修改的文​​件保留在每个文件夹中,并删除其余文件。

它只会将del命令回显到屏幕,因此将echo del更改为del并再次运行以使其正常运行(如果它正在执行您想要的操作)。

@echo off
for /d /r "c:\server\folder" %%a in (*) do (
   pushd "%%a" && (
      echo processing "%%a"
         for /f "skip=1 delims=" %%b in ('dir /b /a-d /o-d') do echo del "%%b"
   popd
   )
)

答案 1 :(得分:0)

@echo off

    setlocal enableextensions

    set "_depot=c:\depot"

    rem Enumerate all the directories under depot, 
    rem and retrieve only those that end with ,d
    for /f "tokens=*" %%d in ('cmd /q /c "(for /r "%_depot%" %%a in (.) do echo "%%~fa")" ^| findstr /e ",d"""') do (
        rem list the files in selected directory, ordered by creation date descending
        rem skip the first file in list and delete the rest
        for /f "tokens=* skip=1" %%f in ('dir /a-d /tc /o-d /b "%%d\*.gz" 2^>nul') do (
            rem WARNING !!! 
            rem DELETING FILES. Remove echo when sure it works as needed
            rem WARNING !!!
            echo del "%%~fd\%%f" 
        )
    )
    endlocal

答案 2 :(得分:0)

如果您有最新版本的Perforce服务器,“p4 archive”命令将为您执行文件存档删除。

以下是文档:http://www.perforce.com/perforce/doc.current/manuals/cmdref/p4_archive.html