Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удалить лишние файлы (http://forum.oszone.net/showthread.php?t=340771)

Patroklos 02-06-2019 16:30 2874091

Удалить лишние файлы
 
Здравствуйте, нужна помощь в решении следующей задачи.
Есть папка .\temp в которой лежат 300 файлов.
Часть файлов больше 1 мегабайта часть файлов менее 100 килобайт.
Нужно удалить (delete) все файлы которые менее 100 килобайт.
Подскажите пожалуйста каким способом лучше всего решить задачу.

YuS_2 02-06-2019 17:49 2874106

Цитата:

Цитата Patroklos
Нужно удалить (delete) все файлы которые менее 100 килобайт. »

powershell
Код:

#requires -v 3.0
$folder = '.\temp'
dir $folder -file|? length -lt 100kb|ri

или
Код:

#requires -v 2.0
$folder = '.\temp'
dir $folder|?{!$_.psiscontainer -and $_.length -lt 100kb}|ri


Patroklos 04-06-2019 19:04 2874377

Цитата:

Цитата YuS_2
dir $folder -file|? length -lt 100kb|ri »

Спасибо. Работает но у дёргать пош из батника не путь самурая.
Выспавшись, на свежую голову написал на смд.
Кстати подскажите пожалуйста на будущее как в вашем примере искать рекурсивно.
То есть если в папке .\temp\ лежат папки с файлами.

megaloman 04-06-2019 21:18 2874405

Patroklos,
Код:

@Echo Off
        Set "BoxIn=z:\Box_In"
        Set /A SS=102400 ||Exit /b 2
       
        Set /A N=-1
        :Begin
                Set /A N+=1
                Call Set "SSS=%%SS:~%N%,1%%"
        If Not "%SSS%"=="" GoTo :Begin
        If %N% GTR 9 Echo %SS% too large &Exit /b 2
        Set /A N+=1
               
        FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%\*.*" /S /B /A:-D`) DO Call :DelSize "%%i" %%~zi %SS% %N%
Exit /B

:DelSize
        Set "SSS=%2"
        Call Set "SSS=%%SSS:~%4,1%%"
        If Not "%SSS%"=="" Exit /B
        If %2 GTR %3 Exit /B
        Del %1
Exit /B

Максимальный размер удаляемых файлов не более 9 знаков

Patroklos 04-06-2019 21:34 2874409

megaloman, обожаю читать ваш код. Каждый раз маленький шедевр. Многому учусь.
Мой код намного проще. Видимо не все нюансы учёл. Вот что у меня получилось.
Код:

setlocal enabledelayedexpansion
set SizeToTerminate=1000
FOR %%A IN (".\files\*.txt") DO (
set size=%%~zA
call :Terminator !size!
)
pause>nul
:Terminator
if %~1 lss %SizeToTerminate% ( echo File size Less From %SizeToTerminate% and Equal %~1
        ) else (
                echo File size Greater From %SizeToTerminate% and Equal %~1 )
goto :eof

Покритикуете?

YuS_2 04-06-2019 22:09 2874422

Цитата:

Цитата Patroklos
Работает но у дёргать пош из батника не путь самурая. »

А это зависит от задачи... как у Шекспира: ехать или шашечки, вот в чем вопрос! :)

Цитата:

Цитата Patroklos
на будущее как в вашем примере искать рекурсивно. »

у командлета get-childitem есть параметр -recurse т.е. так:
Код:

dir $folder -file -rec

megaloman 04-06-2019 22:14 2874423

Цитата:

Цитата Patroklos
Покритикуете? »

Кто умеет/хочет делать - делает, кто не умеет/не хочет - критикует. Если хотите намного проще, натека:
Код:

@Echo Off
        Set "BoxIn=z:\Box_In"
        Set /A SS=44000 ||Exit /b 2
       
        FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%\*.*" /S /B /A:-D`) DO (
                If %%~zi LEQ %SS% Del "%%i"
        )
Exit /B

Критикую оба решения, это моё и Ваше: если среди файлов будет файл длиннее 2147483647 байт арифметика работать не будет. Что получится, лень думать. Попробуйте
Код:

@Echo Off
cls
        Set /A Max=1000

        Set /A A=2147483647
        If %A% GEQ %Max% (Echo %A% ^>=  %Max%) Else (Echo %A% ^<  %Max%)
       
        Set /A A=2247483647
        If %A% GEQ %Max% (Echo %A% ^>=  %Max%) Else (Echo %A% ^<  %Max%)
pause

То есть файл длиной 2247483647 байт мы убъём без зазрения совести - у него отрицательная длина по цэмэдэшной арифметике. В первом коде я пытаюсь от этого застраховаться, поэтому накрутил всякого изврата.
Первый код, кстати, можно подсократить, но он тоже будет работать с длинами файла не более 9 знаков:
Код:

@Echo Off
        Set "BoxIn=z:\Box_In"
        Set /A SS=102400 ||Exit /B 2

        If Not "%SS:~9,1%"=="" (Echo %SS% too large &Exit /B 1)       
               
        FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%\*.*" /S /B /A:-D`) DO (
                Call :DelSize "%%i" %%~zi %SS% 9
        )
Exit /B

:DelSize
        Set "SSS=%2"
        Call Set "SSS=%%SSS:~%4,1%%"
        If Not "%SSS%"=="" Exit /B
        If %2 GTR %3 Exit /B
        Del %1
Exit /B


Опиум 05-06-2019 09:38 2874457

Цитата:

Цитата Patroklos
Нужно удалить (delete) все файлы которые менее 100 килобайт. »

Код:

md 2del
robocopy  /mov /max:102400 /r:0 /w:0  .\temp 2del\
rd /q /s 2del


Ageron 11-06-2019 11:50 2875181

можно одной строкой сделать
FORFILES /P %temp% /S /M * /C "cmd /c if @fsize GTR 100000 echo @path размер файла @fsize"

можно еще добавить /D -30
чтобы удалял только файлы старше 30 дней.


Время: 02:53.

Время: 02:53.
© OSzone.net 2001-