Командная строка для рекурсивного удаления файлов, но исключая определенный файл
Мне нужно удалить файлы определенного типа (.zip файлы, скажем) из папки и всех ее подпапок, используя командную строку. В идеале я ищу что-то, что можно запустить как .bat файл в Windows.
Я знаю, что для команды DEL есть переключатель /S для поиска в подпапках, но для добавления к вызову мне нужно исключить файлы определенного имени (например, "Backup.zip" ).
Есть ли способ удалить файлы рекурсивно, но исключить файлы определенного имени. В моей ситуации нецелесообразно явно перечислять все имена файлов, которые я хочу удалить, только файлы типа соответствия, которые я не хочу удалять.
Ответы
Ответ 1
Хороший трюк: сделайте файлы, которые вы хотите исключить для чтения!
DEL /S
не удалит файл только для чтения.
Следующий script не выполняет точно то, что вы хотите (см. мои замечания ниже), но показывает, как использовать файлы только для чтения, чтобы избежать удаления.
@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
Примечание. Вы можете адаптировать этот script, чтобы игнорировать не только подпапку, но и все файлы заданного типа:
attrib /S *.xxx +r > NUL
фактически поможет вам исключить все "xxx" файлы текущего каталога и всех подкаталогов (следовательно, параметр /S
).
Примечание: "> NUL
" - это redirection, который часто используется для скрытия стандартного вывода, вместо того, чтобы отображать его на экране.
Это может быть опасно при слишком частом использовании (например, в большом цикле с различными путями), поскольку это устройство, и, как и все устройства (AUX
, COMn
, LPTn
, NUL
и PRN
):
- Открытие устройства потребует один дескриптор файла. Однако, в отличие от файлов, устройства никогда не будут закрыты до перезагрузки.
- каждое устройство существует в каждом каталоге на каждом диске, поэтому, если вы использовали перенаправление на
NUL
в, скажем, C:\
, а после этого вы снова используете его в C:\TEMP
, вы потеряете еще один дескриптор файла.
Ответ 2
Вы можете легко скомпилировать набор файлов и выполнить команду для каждого из них, например:
set match=D:\blah\M*.zip
for %%x in (%match%) do (
del %%x
)
Тогда я думаю, вам нужно прочитать эту статью о том, как манипулировать строками в DOS:
http://www.dostips.com/DtTipsStringManipulation.php
Ответ 3
Просто сделай это, легко
- кнопка окна + r
- введите
cmd
и нажмите enter.
- Перейдите в родительский каталог:
введите c:
или d:
(или букву диска, к которому вы хотите перейти)
- введите
dir
, чтобы просмотреть список содержимого этого каталога (dir /ah
, чтобы увидеть скрытые файлы)
- затем, чтобы изменить каталог, введите
cd xxxx
(xxxx = имя каталога)
- Повторите 4 и 5, пока не попадете в каталог, в котором вы хотите запустить пакетное удаление.
- затем введите свой шаблон. Что-то вроде:
del /S /ah *.jpg
и нажмите enter. Он будет проходить через все подкаталоги и удалять все видимые и скрытые файлы .jpg файлы
* является подстановочным знаком
/S удаляет из всех подпапок
/ah a = выбрать файлы на основе атрибута, h = hidden
Пример:, чтобы удалить те раздражающие файлы .DS_Store, которые появляются при копировании с Mac на Windows, выполните:
del /S /ah .DS_Store
или
del /S /ah ._*
который получит все "дубликаты" скрытых файлов, которые также создаются при копировании с Mac на Windows.
Ответ 4
Вы можете просто использовать ниже:
forfiles /p C:\temp-new /s /c "cmd /c if @isdir==FALSE del @file"
Ссылка на ссылку TechNet Referenceenter здесь
Ответ 5
Возможно, команда 'forfiles' может быть использована
http://technet.microsoft.com/en-us/library/cc753551.aspx
Надеюсь, что это поможет.
Ответ 6
Этот script удалит все .zip файлы из папки (и вложенных папок), НО ТОЛЬКО, если имя файла не содержит слова "backup" или "Backup" или "BACKUP" и т.д.
# 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
Script находится в biterscripting (http://www.biterscripting.com). Сохраните script в файле C:/Scripts/DeleteZip.txt. Запустите script как
script "C:/Scripts/DeleteZip.txt" folder("C:/testfolder")
Будет выполнять операцию удаления в папке C:/testfolder и всех ее подпапках на всех уровнях.