Удалить содержимое папок с одинаковыми именами в разных подкаталогах

Удалить содержимое папок с одинаковыми именами в разных подкаталогах

Я использую Windows 10.

У меня есть много папок с одинаковыми именами (например, «data») в разных подкаталогах базового каталога (здесь «d:\dir»).

Как удалить содержимое (содержащее только файлы) всех папок с именем «data», не удаляя их самих?

Например, для трех папок:

d:\dir\data
d:\dir\tmp1\data
d:\dir\tmp3\tmp2\data

решение1

В окне командной строки Windows можно использовать следующую командную строку для удаления всех файлов (не папок) во всех dataкаталогах D:\dirи их подкаталогах:

for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"

Та же командная строка в пакетном файле Windows будет записана следующим образом:

@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"

КомандаДЛЯвыполняет в отдельном командном процессе, запущенном %ComSpec% /Cв фоновом режиме из командной строки:

dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"

Переменная окружения ComSpecобычно определяется так, %SystemRoot%\System32\cmd.exeкак это можно увидеть, посмотрев насистемапеременные среды в WindowsПанель управления - Система - Дополнительные параметры системы - Переменные среды.... Переменная окружения SystemRootопределяется по умолчанию путем к каталогу Windows. Другими словамиДЛЯвыполняется по умолчанию на большинстве ПК с Windows C:\Windows\System32.exeс опцией /Cи командной строкой, указанной между ('и '). См. также статью Википедии со списком предопределенныхПеременные среды Windows.

КомандаДИРвыходы для обработкиСТАНДАРТНЫЙ ВЫВОД(стандартный вывод)

  • в голом формате из-за опции/B
  • только имена каталогов из-за опции /AD(атрибут каталог)
  • с полным путем из-за опции/S
  • соответствие шаблону подстановочных знаков*data
  • в указанном каталогеD:\dir
  • и все его подкаталоги также из-за опции /S.

ДИРвыведет сообщение об ошибке для обработкиСТДЕРР(стандартная ошибка) при отсутствии записи каталога, соответствующей этим критериям. Это сообщение об ошибке подавляется путем перенаправления его на устройствоНУЛЕВОЙс 2>nul.

Итак, выводДИРдля данного примера:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

ВыходДИРобрабатыватьСТАНДАРТНЫЙ ВЫВОДперенаправлен с помощью |для обработкиСТДИН(стандартный ввод) следующей командыFINDSTR.

FINDSTRпоиск в потоке прочитан изСТДИНпострочно

  • регистр не учитывается из-за опции/I
  • буквально интерпретированная строка\data
  • который должен быть найден в конце строки из-за опции /E.

ТакFINDSTRвыходы для обработкиСТАНДАРТНЫЙ ВЫВОДфоновой команды обработать все строки с \dataконца строки, что для данного примера снова:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

Фильтрация вывода командыДИРсFINDSTRнеобходимо исключить каталог с таким именем, MyDataкоторый также выводитсяДИРиз-за подстановочного знака *, который требуется для вывода не всех подкаталогов D:\dir\dataи его подкаталогов, а всех dataкаталогов в D:\dirи его подкаталогах.

Прочитайте статью Microsoft оИспользование операторов перенаправления команддля объяснения 2>nulи |. Операторы перенаправления >и |должны быть экранированы символом вставки ^наДЛЯкомандная строка будет интерпретироваться как буквальные символы, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением командыДЛЯкоторый выполняет встроенную dirкомандную строку в отдельном командном процессе, запущенном в фоновом режиме.

ДЛЯс опцией /Fзахватывает все выходные данные, чтобы в конечном итоге обработатьСТАНДАРТНЫЙ ВЫВОДзапущенного командного процесса и обрабатывает этот вывод построчно после завершения запущенного процесса cmd.exe.

Пустые строки всегда игнорируютсяДЛЯ, но пустых строк не выводитсяДИРиFINDSTR.

ДЛЯигнорирует по умолчанию также все строки, начинающиеся с , ;который является символом конца строки по умолчанию. Но все строки, захваченныеДЛЯв этом случае никогда не начинайте с точки с запятой, поскольку все строки начинаются с . Поэтому можно оставить D:значение по умолчанию . В противном случае обычно лучше всего подходит для обработки списка имен файлов/папок, поскольку ни одно имя файла/папки не может содержать вертикальную черту.eol=;eol=|

ДЛЯпо умолчанию разделит каждую строку на подстроки, используя обычный пробел и символ горизонтальной табуляции в качестве разделителей строк, и назначит указанной переменной цикла только первую строку, разделенную пробелом/табуляцией I. Имя папки в пути к каталогу dataможет содержать символ пробела. По этой причине указан пустой список разделителей, с помощью delims=которого отключается поведение разбиения строк, в результате чего переменной цикла всегда назначается Iполное квалифицированное имя найденной dataпапки.

ДЛЯвыполняется для каждого dataкаталога, назначенного Iкоманде:

del /A /F /Q "%I\*"

%Iзаменяется перед выполнениемДЕЛпо полному имени каталога, назначенному в данный момент переменной цикла I.

КомандаДЕЛдля удаления файлов. Он не удаляет каталоги. Опция /Aиспользуется для удаления всех файлов независимо от их атрибутов, включая файлы со скрытым набором атрибутов, которыеДЕЛне будет удален без параметра /A. Параметр /Fнеобходим для принудительного удаления файла с установленным атрибутом «только для чтения», который не будет удален без параметра /F. Параметр /Qиспользуется для подавления запроса пользователя, действительно ли все файлы, соответствующие параметру , *должны быть удалены параметромДЕЛ.

Полное имя каталога должно быть заключено в двойные кавычки, поскольку оно может содержать пробел или один из этих символов, &()[]{}^=;!'+,`~что требует использования "вокруг строки аргумента команды, как объясняется в справкеКМД на последней странице справки, которая выводится при запуске в окне командной строки cmd /?.

Обратите внимание, чтоДЕЛневозможно удалить файлы, на которые у пользователя нет разрешений NTFS на удаление файлов или которые в данный момент открыты приложением таким образом, что удаление файла во время его открытия приложением невозможно.ДЕЛвыводит сообщение об ошибке для каждого файла, который не может быть удален из-за отсутствия прав NTFS или прав доступа к файлу.

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

  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?

решение2

Следуя вашему примеру, вам придется позвонить:

Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item

решение3

Рекурсивно перечислить все папки с именем «data», затем удалить их содержимое.

$base_dir = 'D:\dir'
$name     = 'data'

Get-ChildItem $base_dir -Recurse -Force | Where-Object {
    $_.PSIsContainer -and
    $_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
    Remove-Item "$_\*" -Recurse -Force
}

В PowerShell v3 и более поздних версиях можно заменить условие фильтра, $_.PSIsContainerиспользуя параметр -Directoryс Get-ChildItem.

Связанный контент