Удалить файлы меньше определенного размера - PullRequest
2 голосов
/ 20 июля 2011

Я хотел бы удалить все файлы, размер которых меньше определенного размера в каталоге. Кто-нибудь знает, есть ли команда Windows, которая сделает это? что-то вроде del *.* where size<3kb

Я сейчас занимаюсь этим:

for /F %%A in ("*.pdf") do If %%~zA LSS 20103409 del %%~fA

и вывод, который я получаю:

C:\Documents and Settings\agordon\Desktop\test>If 6440450 LSS 20103409 del C:\Do
cuments and Settings\agordon\Desktop\test\US Tox 01-06-11.pdf
The system cannot find the path specified.

... даже если этот файл PDF достаточно мал, чтобы его можно было удалить.

Что я делаю не так?

На самом деле это работает:

FOR %%F IN (*.pdf) DO (
IF %%~zF LSS 20103409  DEL %%F
)

Однако он не распознает имена файлов, потому что они имеют пробелы! Как преобразовать имя Windows в имя «DOS» в этом сценарии? Например, имя Windows file name.pdf Мне, вероятно, нужно преобразовать в «DOS», и оно будет выглядеть так: file_name.pdf или что-то в этом роде.

Ответы [ 6 ]

10 голосов
/ 20 июля 2011

Попробуйте это из пакетного скрипта:

@echo off
setlocal
for /f  "usebackq delims=;" %%A in (`dir /b *.pdf`) do If %%~zA LSS 3145728 del "%%A"
1 голос
/ 17 августа 2017

Кстати: использование PowerShell (в Windows 10) было для меня более простым способом:

Я сделал это только в каталоге, где я хочу удалить файлы размером менее 20 МБ:

ls | where {$_.Length -lt 20mb} | Remove-Item
1 голос
/ 18 июля 2015

Хорошо, поэтому я использовал AtomicParsley в сценарии cmd, чтобы добавить иллюстрацию ко всем моим фильмам MP4 в более чем 400 подпапках с параметром --overWrite. Это иногда barfs и оригинальный файл остается менее 2k. Мне нужен был способ найти все эти испорченные файлы MP4, чтобы я мог перезагружать их.

Это то, что я использовал из командной строки на примере Mrchief, и это работает как брелок в Windows 7.

@for /f  "usebackq delims=;" %A in (`dir /s /b *.mp4`) do @If %~zA LSS 2048 echo "%A"

и это вывод после обработки 32 файлов

    D:\Movie>@for /f  "usebackq delims=;" %A in (`dir /s /b *.mp4`) do @If %~zA LSS 2048 echo "%A"
    "D:\Movie\Action\Deadland (2009)\Deadland (2009).mp4"
    "D:\Movie\Science Fiction\Alien3 (1992)\Alien3 (1992).mp4"

    D:\Movie> 

вы можете заменить эхо на del и изменить 2048 для поиска другого размера.

0 голосов
/ 22 сентября 2016

Здесь другой подход, использующий robocopy и его возможности фильтрации.Вот выдержка из File Selection Options, отображаемая при вводе robocopy /? в окне командной строки:

             /MAX:n :: MAXimum file size - exclude files bigger than n bytes.
             /MIN:n :: MINimum file size - exclude files smaller than n bytes.

          /MAXAGE:n :: MAXimum file AGE - exclude files older than n days/date.
          /MINAGE:n :: MINimum file AGE - exclude files newer than n days/date.
          /MAXLAD:n :: MAXimum Last Access Date - exclude files unused since n.
          /MINLAD:n :: MINimum Last Access Date - exclude files used since n.
                       (If n < 1900 then n = n days, else n = YYYYMMDD date).

Следовательно, можно применять опции /MIN и /MAXВот.Поскольку мы не хотим копировать какие-либо файлы, используйте опцию /L, чтобы вывести список всех элементов, которые будут скопированы без переключателя, а затем проанализируйте возвращенный список с помощью цикла for /F, который содержит фактическую команду удаления delв теле:

set "TARGETDIR=."
set "FILES=*.pdf"
for /F "tokens=*" %%F in ('
    robocopy "%TARGETDIR%" "%TARGETDIR%" "%FILES%" ^
        /L /IS /FP /NC /NS /NDL /NP /NJH /NJS ^
        /MIN:0 /MAX:3071
') do (
    ECHO del "%%F"
)

После проверки удалите из сценария верхний регистр ECHO для фактического удаления файлов.

Кроме /MIN,/MAX и /L, есть несколько других опций, определенных в командной строке robocopy, большинство из которых заботятся о необходимом выводе, а именно простой список полных путей соответствующих файлов, без какой-либо дополнительной информации, такой как верхние и нижние колонтитулыили резюме.

Исходный и целевой каталоги установлены в нашем целевом каталоге.Конечно, обычно это не сработает (вы не можете копировать файлы на себя), но поскольку указано /L, список файлов генерируется, но только если также указан ключ /IS (это означает, что "те же файлы"быть рассмотренным).

0 голосов
/ 20 июля 2011

В команде Del нет переключателя, который удаляет файлы в зависимости от размера файла.

0 голосов
/ 20 июля 2011

Я не уверен, как это сделать из DOS, но это то, что мы использовали в прошлом; он использует VBScript, поэтому вы бы назвали этот файл soversize.vbs.

Dim strPath
Dim lngSize

Dim fso
Dim fold
Dim files
Dim file

lngSize = 10000 ' The threshold in bytes (this is 100k)
strPath = "C:\temp\" 'The folder you want to start in

Set fso = CreateObject("scripting.filesystemobject")
Set fold = fso.GetFolder(strPath)
Set files = fold.files

For Each file In files
    If file.Size <= lngSize Then file.Delete True
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...