В Windows мне нужно рекурсивно удалить каталог, за исключением короткого списка файлов, которые нужно сохранить. Файлы могут быть вложены в подкаталоги.
Я попытался сделать файлы доступными только для чтения перед запуском "rmdir / s", но это не сработало. Файлы, доступные только для чтения, не могут быть удалены напрямую, но они удаляются при удалении внутри подкаталога с помощью "rmdir / s".
Есть другие идеи?
Более лучший скриптер, чем я, вероятно, мог бы автоматизировать все это в пару строк, даже используя 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
)
Скрытые файлы не удаляются.
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"