Windows等效查找-delete

时间:2019-05-07 09:17:42

标签: linux windows bash shell cmd

与此Linux命令等效的Windows / DOS是什么?

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

我知道如何删除所有文件,但不知道如何指定异常(即:不删除__init__.py

3 个答案:

答案 0 :(得分:3)

cmd.exe在路径的多个级别中不支持通配符(PowerShell则支持),因此您必须以某种方式进行模拟。

命令行:

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 :(得分:1)

(据我所知)在Windows / DOS搜索中是不可能的,但是在xcopy /excluderobocopy /X...中是可能的。因此,我建议您将除例外之外的所有内容复制到一种备份文件夹中,删除所有原始文件(包括例外),然后将所有内容放回原处。

答案 2 :(得分:1)

您可能可以使用for /Rif,如下所示:

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

在这里,我在del前面加上了echo,因此实际上并没有删除它。一旦看起来像在做您想要的事情,然后消除回声。

如果在批处理文件中执行此操作,则需要将%符号加倍。

for /R是递归的,并且该格式将在当前目录中工作。

%~ni说:“只给我%i的文件名部分”

(目前我正在运行Linux,因此无法验证确切的行为,但是您可以从此开始)。