2013-11-22 2 views
1

Я пытаюсь написать сценарий Windows (для Win7/Server 2008), который удаляет файлы старше определенной даты, сохраняя последний файл, независимо от того, возраст.Windows пакетный файл для удаления файлов из каталогов, но сохранить последний файл в каждом каталоге

Perforce хранит двоичные файлы с версией на сервере или прокси, инкапсулируя его в каталог.

Например, если я хранил image.jpg на сервере и обновляю его дважды, он сохранит его в каталоге, например «image.jpg, d», с пронумерованными файлами gzip внутри.

например.

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 

В этом случае, если я побежал стандартный сценарий удаления Forfiles для файлов старше 14 дней, все шесть файлов будут удалены. Я ищу решение, в котором в этом сценарии удаляются 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

Изменения "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 
    ) 
) 
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 
Смежные вопросы