Удаление всех файлов, которые не соответствуют определенному шаблону - командная строка Windows

12

Удаление элементов через командную строку довольно просто.

del /options filename.extension

Теперь предположим, что я хочу удалить все файлы, которые не заканчиваются на .jpg, в папке, как бы я это сделал.

Дело в том, что у меня есть часть программного обеспечения, которая преобразует все указанные изображения в .jpg, но оставляет оригиналы, которые мне больше не нужны.

Было бы гораздо эффективнее выполнить один оператор, чем делать несколько операторов для каждого отдельного типа файла.

KdgDev
источник

Ответы:

14

Я бы сделал это так:

attrib +r *.jpg
del /q *
attrib -r *.jpg

Это сначала сделает все файлы JPG доступными только для чтения, удалит все остальное (автоматически пропустит файлы только для чтения), а затем снова сделает файлы JPG доступными для записи.

bobbymcr
источник
Работал как чемпион. Примечание: просто добавьте /sв каждую строку, чтобы рекурсивно включать файлы в подкаталоги.
Чак Уилбур
9

Это на самом деле довольно легко.

Вам нужно forбудет перебрать файлы, а затем просто искать расширение:

for %f in (*) do if not %~xf==.jpg del "%f"

должен сделать трюк (код здесь ).

детеныш
источник
спасибо, но это зависит только от того, какую карту я использую.
KdgDev
4
Карта?
Джои
Как мне сказать, если не .jpg, а не .jsp и не .xml, то del?
user1164061
1

Powershell для спасения
Во времена Windows 7/8 это преемник старой доброй командной строки

Del C:\myFolder\* -exclude '*.jpg'

Delэто псевдоним для Remove-Item. У него есть несколько вариантов, таких как recurse, include, exclude и filter (используйте это для RegEx)

Вы должны добавить, \*чтобы включить файлы в заданную папку

nixda
источник
Из подсказки CMD это должно работать:PowerShell.exe -Command "&{Remove-Item C:\MyFolder\* -Exclude '*.jpg'}"
Iszi
Примечание: PowerShell поставляется с Win 7/8. Для Windows XP или Vista вам необходимо скачать и установить его.
Изи
1

Я знаю, что он не отвечает на ваш вопрос напрямую, но вы посмотрели на параметры вашего конвертера, чтобы увидеть, если:

  1. Он может удалить оригиналы сам

или

  1. Написать .jpg в новую папку?
ChrisF
источник
У меня нет прямой возможности сделать это. Что он будет делать, так это переписать оригинал, если это был JPG для начала. Но все остальные остаются на диске, пока создается JPG из них.
KdgDev
@WebDevHobo - да ладно, тогда я пошла бы с предложением Йоханнеса.
ChrisF
0

Я искал способ найти все файлы, которые НЕ имеют расширения ".mp3", в каталоге TREE в Windows 7 (том NTFS), содержащем, возможно, 20 000 файлов в нескольких сотнях каталогов различной глубины ... так что через некоторое время я использовал:

cd <theplace>
dir /S | find /V "<DIR>" | find /V "Total" | find /V "bytes" | find /V "Directory" | find /V "Volume" | find /V ".mp3" | more /S

в нем перечислены файлы, которые не соответствуют .mp3 после удаления всего, что связано с выводом команды DIR ... 99% работает ... если файл, который не соответствует, не назван одним из ключевых слов в стандартном выводе DIR - возможно, есть способ сделать отчет DIR меньшим количеством заголовка / сводной информации - но я не стал беспокоиться, так как он получил большую часть пути.

CaptPat
источник
очевидно, код Posting здесь удаляет некоторые специальные символы ... поэтому команда "cd" выше была на отдельной строке и указывала целевой корневой каталог, а первая команда "find" удаляла все строки, которые содержали "<" DIR "> "(пойди разберись), так как это вывод команды dir - но почтовый индекс здесь может подумать, что это какая-то мета-инструкция и лишает ее ...
CaptPat
1
Есть гораздо более простой способ сделать это: /bфлаг dirкоманды. dir /bбудет перечислять имена файлов и расширения только в текущем каталоге, dir /s /bбудет перечислять полные имена всех файлов в текущем и всех подкаталогах. Трубка find /vвместо forпетли - это приятное прикосновение, которое мне нужно запомнить, но я не думаю, что оно работает del.
Боб
0

Другой способ удалить все файлы, соответствующие имени файла, показан ниже. Список циклов for содержит все файлы, а if NOT соответствует имени файла (без имени каталога).

for /r %f in (*) do if not %~nxf == abc.xml del "%f"
ajuffinger
источник