Rekurencyjnie usuń katalog poza niektórymi plikami w systemie Windows


W systemie Windows muszę rekurencyjnie usunąć katalog, z wyjątkiem krótkiej listy plików do zachowania. Pliki mogą być zagnieżdżane w podkatalogach.
Próbowałem uczynić pliki tylko do odczytu przed uruchomieniem "rmdir/s", ale to nie zadziałało. Plików tylko do odczytu nie można usuwać bezpośrednio, ale są one usuwane po usunięciu z podkatalogu za pomocą „rmdir/s”.
Jakieś inne pomysły?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

  • Znajdź potrzebne pliki.
  • Gdy go znajdziesz, skopiuj żądane drzewo plików/folderów do tymczasowej lokalizacji. [list][*]Robocopy z poprawnymi parametrami może zachować atrybuty i znaczniki czasu.

[/*]
[*]
Usuń katalog.
[/*]
[*]
Skopiuj drzewo plików/folderów z powrotem do jego pierwotnej lokalizacji.
[/*]
[*]
...?
[/*]
[*]
Zysk!
[/*]
[/list]
Lepszy scenarzysta niż ja mógłbym prawdopodobnie zautomatyzować całość w kilku linijkach, nawet używając robocopy. Pomyślałem, że może możesz skopiować listę plików, których potrzebujesz i których używasz
/MIR
możliwość wysadzenia wszystkiego w katalogu źródłowym, czego nie ma w katalogu docelowym.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

O ile wiem, naprawdę nie możesz mieć obu - ani usuwania rekurencyjnego (wszystko idzie), ani nierekurencyjnego (jawnie określasz, co chcesz usunąć).
Jedynym powodem, dla którego próbowana przez ciebie sztuczka tylko do odczytu działa w systemach Unix, jest to, że awaria/błąd rozprzestrzenia się w drzewie (nie możesz usunąć tego, co nadal ma dzieci), a z twojego testu może się wydawać, że Windows mniej dotyczy tego.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Udało mi się to zrobić z jakimś kodem wsadowym, ale jest dość długi:
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)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ukryte pliki nie są usuwane.
  • atrybut + h dla plików, których nie można usunąć
  • usuń wszystkie pliki
  • del puste katalogi
  • Atrybuty + h zapisane pliki.

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"

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się