Windows эквивалент найти-удалить - PullRequest
0 голосов
/ 07 мая 2019

Что такое Windows / DOS, эквивалентный этой команде Linux?

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete

Я знаю, как удалить все файлы, но не знаю, как указать исключение (т. Е. Не удалять __init__.py)

Ответы [ 3 ]

3 голосов
/ 07 мая 2019

cmd.exe не поддерживает подстановочные знаки на нескольких уровнях пути (PowerShell поддерживает), поэтому вам нужно как-то эмулировать это.

Строка Cmd:

for /f "delims=" %F in ('Dir /B /S .\*.py ^|findstr /IE "\\migrations\\[^\\]*.py"^|findstr /IEV "\\__init__.py" ') Do @echo del "%F"

Есливывод выглядит нормально, удалите echo
В пакетном файле удвойте знаки процента %F => %%F

PowerShell

Get-ChildItem .\*\migrations\*.py -exclude __init__.py | Remove-Item -WhatIf

Если вывод выглядит нормально,удалить -WhatIf

В этом примере дерева

> tree /F
A:.
└───test
    │   alpha.py
    │   bravo.py
    │
    └───migrations
            alpha.py
            bravo.py
            __init__.py

на выходе будет

del "A:\test\migrations\alpha.py"
del "A:\test\migrations\bravo.py"

WhatIf: Ausführen des Vorgangs "Datei entfernen" für das Ziel "A:\test\migrations\alpha.py".
WhatIf: Ausführen des Vorgangs "Datei entfernen" für das Ziel "A:\test\migrations\bravo.py".
1 голос
/ 07 мая 2019

Возможно, вы можете использовать for /R и if, что-то вроде этого:

for /r %i in (*.py) do (
  if "%~ni"=="__init__" (
    echo Skipping %i
  ) else (
    echo del "%i"
  )
)

Здесь я добавил префикс del к команде echo, поэтому она фактически не удаляется. Как только все будет выглядеть так, как вы хотите, уберите это эхо.

Если вы сделаете это в пакетном файле, вам нужно будет удвоить знаки%.

for /R является рекурсивным для, и в этом формате будет работать из текущего каталога.

%~ni говорит "дайте мне только часть имени файла,% i"

(Я сейчас использую Linux, поэтому не могу проверить точное поведение, но вы могли бы начать с этого).

1 голос
/ 07 мая 2019

Исключения невозможны (насколько я знаю) в поиске Windows / DOS, но они возможны в xcopy /exclude и robocopy /X....Поэтому я бы посоветовал вам скопировать все, кроме исключений, в какую-то папку для резервных копий, удалить все исходные (включая исключения) и вернуть все обратно.

...