与此Linux命令等效的Windows / DOS是什么?
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
我知道如何删除所有文件,但不知道如何指定异常(即:不删除__init__.py
)
答案 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 /exclude
和robocopy /X...
中是可能的。因此,我建议您将除例外之外的所有内容复制到一种备份文件夹中,删除所有原始文件(包括例外),然后将所有内容放回原处。
答案 2 :(得分:1)
您可能可以使用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,因此无法验证确切的行为,但是您可以从此开始)。