如果子目录中不存在具有不同扩展名的相应文件,则删除文件

时间:2017-09-19 21:24:49

标签: batch-file

我有一个带有一堆.rst文件的文件夹,另一个带有一堆.md文件的文件夹分散在子目录中。对于每个.rst文件,我想检查是否存在具有相同名称的相应.md文件。如果没有相应的.md文件,我想删除.rst文件。

这是我到目前为止所拥有的:

for %%A in (buildfiles\source\*.rst) do if not exist "%%~nA.md" del "%%A"

只要.md文件与批处理文件位于同一目录中,就可以正常工作。我无法弄清楚如何让它搜索特定文件夹的所有子目录,以确定相应的.md文件是否不存在。例如,这并不是我想做的事情:

for %%A in (buildfiles\source\*.rst) do if not exist "pages\%%~nA.md" del "%%A"

因为它只搜索特定的"页面"文件夹,而不是它的所有子目录。

编辑添加:我已广泛搜索网站,并且我知道/ S通常用于搜索子目录,但在&#34之后简单地添加它并不起作用;如果不存在"。例如,这会出错:

for %%A in (buildfiles\source\*.rst) do if not exist "pages\%%~nA.md" /S del "%%A"

如何获得"如果不存在"部分在子目录中搜索?

1 个答案:

答案 0 :(得分:0)

方法-1 :只需1个命令行:

for %%A in (buildfiles\source\*.rst) do (msr -rp pages -l -f "%%~nA.md" && del "%%A")

  • msr -rp xxx && del xxx表示not found(return = %ERRORLEVEL% = 0)也可以 delete
  • 隐藏msr.exe添加> nul的输出,例如:msr -rp pages -l -f "%%~nxA.md" >nul

方法-2 :4行:如果您使用!ERRORLEVEL!

,请使用%ERRORLEVEL%代替SetLocal EnableExtensions EnableDelayedExpansion
for %%A in (buildfiles\source\*.rst) do (
  msr -rp pages -l -f "%%~nA.md" >nul
  if %ERRORLEVEL% EQU 0 del "%%A"
)

msr.exe / msr.gcc*是一个单独的exe工具,在我的开放项目https://github.com/qualiu/msr tools目录中没有依赖项。文档是内置的,只需运行它;或者从上面的链接或https://qualiu.github.io/msr/usage-by-running/msr-Windows.html获取。

(如果您的Windows是x86 / 32位计算机,请使用msr-Win32.exe。)

添加更快速的方法 :(对page中的每个rst文件扫描buildfiles\source以上两种方法

已添加nin.exe,该地址与msr.exe位于同一位置;递归搜索buildfiles\sourcepages 仅一次,通过3个命令管道(2 msr.exe + 1 nin.exe命令)。

  • 方法-3 :生成命令(-o "del xxx")并执行del-X),您可以预览生成的del没有-X的命令;隐藏-X -PAC的一些输出:

    msr -rp buildfiles\source,pages -l -f "\.(rst|md)$" -PIC | nin nul "([^\\/]+)\.(rst|md)$" -updAC | msr -x buildfiles\source -t "^1\D.*?:\s*(.+)\s*$" -o "del \"$1\"" -X

  • 方法-4 :获取文件列表并删除:(需要在|循环中将每个管道^|转义为for,这是为什么我更喜欢-X喜欢方法-3 来处理简单的情况)

    for /f "tokens=*" %%a in ('msr -rp buildfiles\source,pages -l -f "\.(rst|md)$" -PIC ^| nin nul "([^\\/]+)\.(rst|md)$" -updAC ^| msr -x buildfiles\source -t "^1\D.*?:\s*(.+)\s*$" -o "$1" -PAC') do del %%a

您还可以使用msr -x ".rst" -t "^1\D.*?:\s*(.+)\s*$" -o "$1"msr -t "^1\D.*?:\s*(.+\.rst)\s*$ -o "$1"代替msr -x buildfiles\source -t "^1\D.*?:\s*(.+)\s*$" -o "$1"来获取孤立.rst文件(1次匹配)。