我正在尝试编写一个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
答案 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