Командная строка для рекурсивного удаления файлов, но исключая определенный файл

Мне нужно удалить файлы определенного типа (скажем, файлы .zip) из папки и всех ее подпапок с помощью командной строки. В идеале я ищу что-то, что можно запустить как файл .bat в Windows.

Я знаю, что есть переключатель /S для команды DEL для поиска в подпапках, но чтобы усложнить задачу, мне нужно исключить файлы с определенным именем (например, «Backup.zip»).

Есть ли способ рекурсивно удалять файлы, но исключать файлы с определенным именем. В моей ситуации будет нецелесообразно явно перечислять все имена файлов, которые я хочу удалить, а только файлы соответствующего типа, которые я не хочу удалять.


person Tim C    schedule 11.02.2009    source источник


Ответы (7)


Хороший трюк: сделайте файлы хотите исключить только для чтения!

DEL /S не будет удалять файл только для чтения.

Следующий сценарий не делает в точности то, что вам нужно (см. мои комментарии ниже), но показывает, как можно использовать файлы только для чтения, чтобы избежать их удаления.

@ECHO OFF
:: This example supposes your first parameter is
:: the relative path to the folder to be deleted
:: and the second is the relative path (from the
:: the target folder) of the one to be excluded
:: Notice that this will only work if the folders
:: are in the working drive, if not, you ll
:: have to specify full paths

IF "%1"=="" GOTO ERROR
IF "%2"=="" GOTO ERROR
IF NOT EXIST %1\NUL GOTO ERROR
CD %1
IF NOT EXIST %2\NUL GOTO ERROR
ECHO Starting up the deletion process
ECHO. * Setting attributes
attrib %1\*.mp3 -r -s -h > NUL
attrib %2\*.mp3 +r > NUL
ECHO. * Deleting files
del /s %1\*.mp3
ECHO. * Reseting attributes
attrib %2\*.mp3 -r > NUL
ECHO.
ECHO Operation completed!
ECHO.
GOTO END

:ERROR
ECHO Parameters:
ECHO. Param1 -> target folder
ECHO. Param2 -> folder to be ignored
ECHO.
GOTO END

:END

Примечание: вы можете адаптировать этот скрипт, чтобы игнорировать не только вложенную папку, но и все файлы данного типа:

attrib /S *.xxx +r > NUL

фактически поможет вам исключить все файлы 'xxx' текущего каталога и всех подкаталогов (отсюда и опция /S).


Примечание. Часть "> NUL" — это перенаправление, часто используемое для скрыть стандартный вывод, а не отображать его на экране.
Слишком частое использование может быть опасным (например, в большом цикле с разными путями), так как это устройство и, как все устройства (AUX, COMn, LPTn, NUL и PRN):

  • открытие устройства потребует один дескриптор файла. Однако, в отличие от файлов, устройства никогда не будут закрыты до перезагрузки.
  • каждое устройство существует в каждом каталоге на каждом диске, поэтому, если вы использовали перенаправление на NUL, скажем, в C:\, а затем снова использовали его в C:\TEMP, вы потеряете еще один дескриптор файла.
person VonC    schedule 11.02.2009
comment
Я еще не понимаю бит › NUL, но мне нравится идея установки атрибутов. Ваше здоровье! - person Tim C; 11.02.2009
comment
интересный! обратите внимание, что rd /s your_directory также стирает системные и скрытые файлы - person Junior Mayhé; 29.11.2009

Вы можете легко зациклить набор файлов и выполнить команду для каждого из них, например:

set match=D:\blah\M*.zip
for %%x in (%match%) do (
del %%x
)

Тогда я думаю, вам нужно прочитать эту статью о том, как манипулировать строками в DOS: http://www.dostips.com/DtTipsStringManipulation.php

person Magnus Smith    schedule 11.02.2009

Просто сделай это, легко

  1. кнопка виндовс + р
  2. введите cmd и нажмите Enter
  3. Navigate to parent directory:
    type c: or d: (or letter of the drive you want to navigate to)
  4. type dir to see a list of that directory's contents ( dir /ah to see hidden files )
  5. затем, чтобы изменить каталог, введите cd xxxx (xxxx = имя каталога)
  6. Повторяйте 4 и 5, пока не дойдете до каталога, в котором вы хотите запустить пакетное удаление.
  7. затем введите шаблон. Что-то вроде: del /S /ah *.jpg и нажмите Enter. Он будет проходить через все подкаталоги и удалять все видимые и скрытые файлы, которые являются файлами .jpg.

* — это подстановочный знак
/S удаляет из всех подпапок
/ah a = выбирать файлы на основе атрибута, h = скрыто

Пример. чтобы удалить надоедливые файлы .DS_Store, которые появляются при копировании с Mac в Windows, выполните:

del /S /ah .DS_Store

or

del /S /ah ._*

который получит все «дубликаты» скрытых файлов, которые также создаются при копировании с Mac на Windows.

person ucsarge    schedule 04.03.2012

Вы можете просто использовать ниже:

forfiles /p C:\temp-new /s /c "cmd /c if @isdir==FALSE del @file"

справочник по TechNetвведите здесь описание ссылки

person Govardhan Gunnala    schedule 11.11.2011

Возможно, вам может пригодиться команда forfiles.

http://technet.microsoft.com/en-us/library/cc753551.aspx

Надеюсь, это поможет.

person Community    schedule 11.02.2009

Этот скрипт удалит все файлы .zip из папки (и подпапок), НО ТОЛЬКО ЕСЛИ имя файла не содержит слова «резервная копия», или «Резервная копия», или «РЕЗЕРВНАЯ КОПИЯ» и т. д.

# Script DeleteZip.txt
var str folder, filelist, file
cd $folder
lf -r -n "*.zip" > $filelist
while ($filelist <> "")
do
    lex "1" $filelist > $file
    # Does this $file contain the word "backup" ? Do case independent search (-c option).
    if ( { sen -c "^backup^" $file } <= 0 )
        system del ("\""+$file+"\"")
    endif
done

Скрипт находится в битерскриптинге ( http://www.biterscripting.com ). Сохраните скрипт в файл C:/Scripts/DeleteZip.txt. Запустите скрипт как

script "C:/Scripts/DeleteZip.txt" folder("C:/testfolder")

Выполнит операцию удаления папки C:/testfolder и всех ее подпапок на всех уровнях.

person P M    schedule 21.02.2010

Простой способ, который вам нужен:

FORFILES /P "DIRECTORY" /S /M SEARCHMASK /C "cmd /c if @file neq \"FILE_TO_EXCLUDE\" del /f @file"

Вы по-прежнему можете адаптировать команду для исключения определенных файлов и/или по дате. Более подробная информация приведена в документации «forfiles» ниже.

https://docs.microsoft.com/pt-br/windows-server/administration/windows-commands/forfiles

person Eduardo Garcia    schedule 10.07.2021