Войти

Показать полную графическую версию : [решено] Удалить лишние файлы


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

YuS_2
02-06-2019, 17:49
Нужно удалить (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
dir $folder -file|? length -lt 100kb|ri »
Спасибо. Работает но у дёргать пош из батника не путь самурая.
Выспавшись, на свежую голову написал на смд.
Кстати подскажите пожалуйста на будущее как в вашем примере искать рекурсивно.
То есть если в папке .\temp\ лежат папки с файлами.

megaloman
04-06-2019, 21:18
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
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
Работает но у дёргать пош из батника не путь самурая. »
А это зависит от задачи... как у Шекспира: ехать или шашечки, вот в чем вопрос! :)

на будущее как в вашем примере искать рекурсивно. »
у командлета get-childitem есть параметр -recurse т.е. так:
dir $folder -file -rec

megaloman
04-06-2019, 22:14
Покритикуете? »@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 байт мы убъём без зазрения совести - у него отрицательная длина по цэмэдэшной арифметике. В первом коде я пытаюсь от этого застраховаться, поэтому накрутил всякого изврата. @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
Нужно удалить (delete) все файлы которые менее 100 килобайт. »

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

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

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




© OSzone.net 2001-2012