windows - (Batch) Sådan rekursivt sletter alle filer/mapper i en mappe undtagen de med en ledende.?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en mappe, src. Jeg vil rekursivt slette alt indhold undtagen filer (.gitignore, ...) og mapper (.git, .vscode, ...) hvis navne begynder med .]]. Matchning af dette mønster i undermapper er hverken nødvendigt eller skadeligt.


Hvad er den reneste måde at gøre dette på i en batchfil?

Bedste reference


@ECHO OFF
SETLOCAL
SET "sourcedir=U:sourcedir"

:: step 1 : delete all files NOT starting "."

FOR /f "tokens=1*delims=" \%\%a IN (
 'dir /s /b /a-d "\%sourcedir\%*" '
 ) DO (
 ECHO \%\%~nxa|FINDSTR /b /L "." >nul
 IF ERRORLEVEL 1 ECHO(DEL "\%\%a"
)

:: step 2 : delete all directories NOT starting "."

FOR /f "tokens=1*delims=" \%\%a IN (
 'dir /s /b /ad "\%sourcedir\%*" ^|sort /r'
 ) DO (
 ECHO \%\%~nxa|FINDSTR /b /L "." >nul
 IF ERRORLEVEL 1 ECHO(RD "\%\%a"
)
GOTO :EOF


Du skal ændre indstillingen for sourcedir for at passe til dine forhold.


De nødvendige DEL-kommandoer er kun ECHO ed til testformål. Når du har bekræftet, at kommandoerne er korrekte , skal du ændre ECHO(DEL til DEL for faktisk at slette filerne.


De nødvendige RD-kommandoer er kun ECHO ed til testformål. Når du har bekræftet, at kommandoerne er korrekte , skal du ændre ECHO(RD til RD for at slette katalogerne rent faktisk.


For hvert filnavn i hele undertræet skal du se om det starter med ., indstilling errorlevel til ikke-0 hvis ikke og dermed slet filen.


Når dette er blevet gjort, gentag operationen med katalognavne, men sorter navne fundet i omvendt, så et underkatalognavn for en mappe vises før mappenavnet. Forsøg for at fjerne mappen med en rd - den forbliver, hvis den indeholder filer eller undermapper (hvilket implicit vil starte .). Tilføj 2>nul til linjen rd for at undertrykke fejlmeddelelser (hvor mappen ikke kan fjernes, da den stadig indeholder filer/undermapper)

Andre referencer 1


Prøv dette for at udelukke mapper med en ledende prik (på en mappebase):


for /f "tokens=*eol=." \%\%A in ('dir /B /AD') do Echo=\%\%A


Dette påvirker ikke mappenavne, der indeholder prikker i andre stillinger.


En forholdsvis langsom variant, der genvinder alle mapper og bruger findstr til at filtrere alle mapper indeholdende ., begge chars behøver at undslippe med en tilbageslag


for /r /D \%\%A in (*) do @echo \%\%A|findstr /V "\."