有没有办法删除只包含一个特定文件的文件夹?

Posted

技术标签:

【中文标题】有没有办法删除只包含一个特定文件的文件夹?【英文标题】:Is there a way to delete a folder that contains only one specific file with batch? 【发布时间】:2022-01-06 07:20:02 【问题描述】:

如果文件夹 (rd/rmdir) 仅包含一个特定文件,则需要一种删除该文件夹的方法。如果有任何其他文件或子文件夹,请忽略它。尝试用尽可能少的代码来做到这一点。目前,我正在这样做......

If Exist "C:\Folder\SubFolder\filename.txt" Move /Y "C:\Folder\SubFolder\filename.txt" "%TEMP%"
If Not Exist "C:\Folder\SubFolder\*" RD "C:\Folder\SubFolder" /Q /S

但是,即使该文件夹不包含任何文件,该文件夹也不会被删除。

这可能在批处理文件中吗?提前谢谢。

【问题讨论】:

If Not Exist "C:\Folder\SubFolder\*" 是你的问题。您不能使用通配符来搜索任何类似的文件。 您能说明一下具体的任务吗?是否要识别仅包含一个特定文件但不包含其他文件或目录对象的目录,如果找到,则移动该文件并删除该目录?是否要找到包含特定文件的目录,移动该文件,然后删除该目录,而不考虑其中可能保留的任何其他文件或目录对象?或者可能是为了识别包含特定文件的目录,并且只有在移动该文件后该目录变为空时,才删除该目录? 【参考方案1】:

您可以使用find 计算目录中的文件数,然后使用findstr 确定错误级别,只需使用条件运算符&&

也不需要检查文件是否存在,找不到文件时可以将stderr重定向到nul

@echo off
Move /Y "C:\Folder\SubFolder\filename.txt" "%TEMP%" 2>nul
(dir /b "C:\Folder\SubFolder\*" | find /C /V "^" | findstr /R "\<0\>") && rd /S /Q "C:\Folder\SubFolder"

编辑

正如您提到的,您现在只想移动目录中唯一的文件,当前代码中的一些修改可以解决这个问题:

@echo off
set "_dir=C:\Folder\SubFolder"
set "fname=filename.txt"

(dir /b "%_dir%\*" | find /C /V "^" | findstr /R "\<1\>" >nul) && if exist "%_dir%\%fname%" (
   move /Y "%_dir%\%fname%" "%temp%"
   rd /S /Q "%_dir%"
)

这一次,我们检查文件夹中是否只有1项(文件或目录),如果是,我们测试看看是否是filename.txt,如果不是,那么我们将跳过代码块,如果是,请移动文件并删除目录。

我为您创建了变量_dirfname,这样您只需更新这两个字段而不是整个代码。

【讨论】:

这很完美!但是,现在,将有问题的文件移动到 TEMP 文件夹后,如果您要检查的文件夹不为空,我们如何将文件移回?再次感谢。 会更新答案。

以上是关于有没有办法删除只包含一个特定文件的文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除充满 csv 文件的文件夹中没有特定标题的所有列?

有没有办法只在 Tomcat/Wildfly/Glassfish 启动时运行方法/类?

有没有办法从 ASC 文件中逐行读取并在特定子字符串后检查它?

有没有办法以编程方式确定字体文件是不是具有特定的 Unicode 字形?

Git status - 有没有办法只在特定目录中显示更改?

Linux文件删除恢复