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

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

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

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

Ответы [ 6 ]

8 голосов
/ 11 февраля 2009

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

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, вы потеряете другой дескриптор файла.
3 голосов
/ 04 марта 2012

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

  1. кнопка Windows + R
  2. введите cmd и нажмите Enter
  3. Перейдите в родительский каталог:
    введите c: или d: (или букву диска, на который вы хотите перейти)
  4. введите dir, чтобы увидеть список содержимого этого каталога (dir /ah, чтобы увидеть скрытые файлы)
  5. затем, чтобы изменить каталог, введите cd xxxx (xxxx = имя каталога)
  6. Повторяйте 4 и 5, пока не попадете в каталог, в котором вы хотите запустить пакетное удаление
  7. затем введите свой шаблон. Что-то вроде: del /S /ah *.jpg и нажмите Enter. Он будет проходить через все подкаталоги и удалять все видимые и скрытые файлы, которые являются файлами .jpg

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

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

del /S /ah .DS_Store

или

del /S /ah ._*

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

3 голосов
/ 11 февраля 2009

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

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

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

2 голосов
/ 11 ноября 2011

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

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

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

1 голос
/ 21 февраля 2010

Этот скрипт удалит все 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 и всех ее подпапок на всех уровнях.

1 голос
/ 11 февраля 2009

Возможно, команда 'forfiles' может быть полезна

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

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

...