批处理文件 - 删除名称与此正则表达式或那个正则表达式匹配但不是那个的文件
Batch file - Deleting files with a name matching this regex OR that regex but NOT that one
我尝试编写一个 Windows 批处理文件来删除匹配目录中的所有文件 ((regex1
or regex2
) 而不是 regex3
).
我可以使用如下方式删除与正则表达式匹配的文件:
for /f "tokens=*" %%a in (
'dir /a-d /b *.* ^| findstr /r /c:"^test[0-9]*.jar$"'
) do del "%%a"
但我不知道怎么说:
- 这个正则表达式或这个。
- 但不是这个
~~~
更新
我正在尝试做的更好的例子:
.bat
文件将在 7-zip's SFX(自解压)可执行文件解压结束时自动 运行。此可执行文件将更新文件夹结构中的一些版本控制的 jar。
假设可执行文件将在 lib
文件夹中提取一个 test-1.0.2.jar
文件。如果这个确切的文件(相同版本)已经存在,那么它将被覆盖,这已经很好地工作了,因为它是由 SFX 可执行文件本身管理的。但是如果lib
文件夹中已经有同一个文件的其他版本,我要.bat文件删除它们!例如:
test-1.0.1.jar
test-1.0.3.jar
test-1.0.jar
test-1.jar
test.jar
...必须删除。
但是那些必须不能被删除:
test-1.0.2.jar
(新文件本身)
test-test2-1.0.0.jar
(不是同一个文件的版本)
我目前无法在 .bat 中仅使用 one 正则表达式来表达这一点,因为 findstr
的正则表达式功能非常有限。但如果我能说:
任何东西 :
^test.jar$
或
^test-[0-9]+.jar$
或
^test-[0-9]+.[0-9]+.jar$
或
^test-[0-9]+.[0-9]+.[0-9]+.jar$
...必须删除 except :
test-1.0.2.jar
那就可以了。
有什么想法吗?
如果您想保留最新版本,那么我认为您会希望保留 test-1.0.3.jar,而不是 test-1.0.2.jar。但我假设你知道自己在做什么。
使用我的 JREN.BAT hybrid JScript/batch utility 很容易解决这个问题。 JREN.BAT 是纯脚本,可以在任何 Windows XP 以后的机器上本地运行。
JREN.BAT 的真正目的是通过正则表达式替换来重命名文件(或文件夹)。但是有一个 /LIST 选项只列出结果,而不实际重命名任何内容。 /RFM 选项指定一个正则表达式文件掩码以确定要包含哪些文件。 /FX 选项用于指定排除列表。
从命令行:
for /f "delims=" %F in ('jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"') do del "%F"
或从批处理脚本中:
@echo off
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"'
) do del "%%F"
更新回复评论
要从 "%dp0lib"
中删除文件(请参阅 OP 的评论),您可以使用(请注意 %dp0
已经以 \
结尾):
@echo off
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$" /p "%~dp0lib"'
) do del "%~dp0lib\%%F"
或
@echo off
pushd "%~dp0lib"
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"'
) do del "%%F"
popd
最终更新以在 PATH 未指向 jren 时支持路径中的空格
@echo off
for /f "delims=" %%F in (
'^""%~dp0jren.bat" "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$" /p "%~dp0lib"^"'
) do del "%~dp0lib\%%F"
我尝试编写一个 Windows 批处理文件来删除匹配目录中的所有文件 ((regex1
or regex2
) 而不是 regex3
).
我可以使用如下方式删除与正则表达式匹配的文件:
for /f "tokens=*" %%a in (
'dir /a-d /b *.* ^| findstr /r /c:"^test[0-9]*.jar$"'
) do del "%%a"
但我不知道怎么说:
- 这个正则表达式或这个。
- 但不是这个
~~~
更新
我正在尝试做的更好的例子:
.bat
文件将在 7-zip's SFX(自解压)可执行文件解压结束时自动 运行。此可执行文件将更新文件夹结构中的一些版本控制的 jar。
假设可执行文件将在 lib
文件夹中提取一个 test-1.0.2.jar
文件。如果这个确切的文件(相同版本)已经存在,那么它将被覆盖,这已经很好地工作了,因为它是由 SFX 可执行文件本身管理的。但是如果lib
文件夹中已经有同一个文件的其他版本,我要.bat文件删除它们!例如:
test-1.0.1.jar
test-1.0.3.jar
test-1.0.jar
test-1.jar
test.jar
...必须删除。
但是那些必须不能被删除:
test-1.0.2.jar
(新文件本身)test-test2-1.0.0.jar
(不是同一个文件的版本)
我目前无法在 .bat 中仅使用 one 正则表达式来表达这一点,因为 findstr
的正则表达式功能非常有限。但如果我能说:
任何东西 :
^test.jar$
或^test-[0-9]+.jar$
或^test-[0-9]+.[0-9]+.jar$
或^test-[0-9]+.[0-9]+.[0-9]+.jar$
...必须删除 except :
test-1.0.2.jar
那就可以了。
有什么想法吗?
如果您想保留最新版本,那么我认为您会希望保留 test-1.0.3.jar,而不是 test-1.0.2.jar。但我假设你知道自己在做什么。
使用我的 JREN.BAT hybrid JScript/batch utility 很容易解决这个问题。 JREN.BAT 是纯脚本,可以在任何 Windows XP 以后的机器上本地运行。
JREN.BAT 的真正目的是通过正则表达式替换来重命名文件(或文件夹)。但是有一个 /LIST 选项只列出结果,而不实际重命名任何内容。 /RFM 选项指定一个正则表达式文件掩码以确定要包含哪些文件。 /FX 选项用于指定排除列表。
从命令行:
for /f "delims=" %F in ('jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"') do del "%F"
或从批处理脚本中:
@echo off
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"'
) do del "%%F"
更新回复评论
要从 "%dp0lib"
中删除文件(请参阅 OP 的评论),您可以使用(请注意 %dp0
已经以 \
结尾):
@echo off
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$" /p "%~dp0lib"'
) do del "%~dp0lib\%%F"
或
@echo off
pushd "%~dp0lib"
for /f "delims=" %%F in (
'jren "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$"'
) do del "%%F"
popd
最终更新以在 PATH 未指向 jren 时支持路径中的空格
@echo off
for /f "delims=" %%F in (
'^""%~dp0jren.bat" "^" "" /list /fx "test-1.1.2.jar" /rfm "^test(?:-\d+(?:\.\d+)*)?\.jar$" /p "%~dp0lib"^"'
) do del "%~dp0lib\%%F"