Назад | Перейти на главную страницу

Рекурсивно удалить каталог, кроме некоторых файлов в Windows

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

Я попытался сделать файлы доступными только для чтения перед запуском "rmdir / s", но это не сработало. Файлы, доступные только для чтения, не могут быть удалены напрямую, но они удаляются при удалении внутри подкаталога с помощью "rmdir / s".

Есть другие идеи?

  1. Найдите нужные файлы.
  2. Когда найдете, скопируйте нужное дерево файлов / папок во временное место.
    • Robocopy с правильными параметрами может сохранять атрибуты и отметки времени.
  3. Удалить каталог.
  4. Скопируйте дерево файлов / папок обратно в исходное место.
  5. ...?
  6. Прибыль!

Более лучший скриптер, чем я, вероятно, мог бы автоматизировать все это в пару строк, даже используя robocopy. Я подумал, может, вы скопируете список нужных файлов и воспользуетесь /MIR возможность сдуть все в исходном каталоге, которого нет в целевом каталоге.

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

Единственная причина, по которой трюк только для чтения, который вы пробовали, работает в системах Unix, заключается в том, что сбой / ошибка распространяется вверх по дереву (вы не можете удалить то, что все еще имеет дочерние элементы), и из вашего теста может показаться, что Windows меньше особенно об этом.

Мне удалось сделать это с помощью некоторого пакетного кода, но он довольно длинный:

setlocal enabledelayedexpansion

:: Delete files not containing "foo"
for /r MyDir %%i in (*) do (
  set temp=%%~nxi
  if "!temp:foo=!"=="!temp!" (
    del "%%i"
  )
)

:: Build recursive list of dirs, sorted by deepest first
set dirs=
for /r MyDir /d %%i in (*) do (
  set dirs="%%i" !dirs!
)

:: Delete dirs.  Nonempty dirs will be skipped.
for %%i in (%dirs%) do (
  rmdir %%i
)

Скрытые файлы не удаляются.

  1. attrib + h для файлов, которые нельзя удалять
  2. удалить все файлы
  3. del пустые каталоги
  4. attrib + h файлы сохранены.

Vg:

for /f "delims=" %i in ('dir "My Dir\\*.log" /b /s') do attrib +h "%i"
for /f "delims=" %i in ('dir "My Dir" /b /s') do del "%i" /q
rmdir /s
for /f "delims=" %i in ('dir "My Dir" /b /s /ah') do attrib -h "%i"