删除不同子目录中具有相同名称的文件夹的内容

行进

我正在使用Windows 10。

我在基本目录(此处为“ d:\ dir”)的不同子目录中有许多相同的命名文件夹(假设名称为“ data”)。

如何删除所有名为“数据”的文件夹的内容(仅包含文件)而不删除自身?

例如,三个文件夹:

d:\ dir \ data 
d:\ dir \ tmp1 \ data 
d:\ dir \ tmp3 \ tmp2 \ data
莫菲

在Windows命令提示符窗口中,以下命令行可用于仅删除及其子目录的所有data目录中的所有文件(而非文件夹)D:\dir

for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"

在Windows批处理文件中,将相同的命令行编写如下:

@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"

命令FOR在一个单独的命令过程中执行,该过程以后台%ComSpec% /C命令行开始:

dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"

ComSpec通常定义环境变量%SystemRoot%\System32\cmd.exe就像在Windows控制面板-系统-高级系统设置-环境变量...中查看系统环境变量所看到的那样默认情况下,环境变量是使用Windows目录的路径定义的。换句话说,默认情况下,FOR在大多数Windows PC上使用选项和命令行在之间指定的方式执行另请参阅Wikipedia文章,其中包含预定义的Windows环境变量列表SystemRootC:\Windows\System32.exe/C('')

命令DIR输出以处理STDOUT(标准输出)

  • 由于选择,以裸格式显示 /B
  • 只是目录名称,因为有选项/AD(属性目录)
  • 由于选择而具有完整路径 /S
  • 匹配通配符模式 *data
  • 在指定目录中 D:\dir
  • 及其所有子目录也都因为option /S

如果没有符合这些条件的目录条目,DIR将输出一条错误消息来处理STDERR(标准错误)。通过使用将其重定向到设备NUL可以抑制此错误消息2>nul

因此,对于给定的示例DIR的输出为

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

用于处理STDOUTDIR的输出重定向|至用于处理下一个命令FINDSTR的STDIN(标准输入)

FINDSTR在流搜索读取STDIN逐行

  • 由于选择不区分大小写 /I
  • 字面解释的字符串 \data
  • 由于option,必须在行的末尾找到它/E

因此,FINDSTR输出以处理后台命令的STDOUT处理行\data尾的所有行,这再次是给定示例的:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

必须使用FINDSTR过滤命令DIR的输出,以排除具有类似名称的目录,该目录也将由DIR输出,因为通配符要求不输出其及其子目录的所有子目录,而是输出其及其子目录中的所有目录MyData*D:\dir\datadataD:\dir

阅读有关使用命令重定向运算符的Microsoft文章,获取有关2>nul的说明|当Windows命令解释器在执行命令FOR之前,Windows命令解释器处理此命令行时,重定向操作符>|必须^FOR命令行使用脱字符号转义为文字字符,该命令在后台启动的单独命令进程中执行嵌入式命令行。dir

带选项的FOR/F最终捕获所有输出,以处理启动的命令进程的STDOUT,并在启动终止后逐行处理此输出cmd.exe

空行始终被FOR忽略,但DIRFINDSTR没有输出空行

默认情况下,FOR也会忽略所有以a开头的行,;这是默认的行尾字符。但是在这种情况下FOR捕获的所有行都不会以分号开头,因为所有行都以开头D:因此eol=;可以保留默认值否则eol=|,通常最好是处理文件/文件夹名称列表,因为没有文件/文件夹名称可以包含竖线。

默认情况下,FOR将使用正常空格和水平制表符作为字符串定界符将每一行拆分为子字符串,并且仅将第一个空格/制表符分隔的字符串分配给指定的循环变量I目录路径中的文件夹名称data可能包含空格字符。因此,指定了一个空的定界符列表,该列表delims=将禁用行分割行为,从而导致I始终将分配给循环变量的已找到data文件夹的全限定名称分配给循环变量

FORdata分配给I命令的每个目录执行:

del /A /F /Q "%I\*"

%I在执行DEL之前将其替换为当前分配给循环变量的完整合格目录名称I

命令DEL用于删除文件。它不会删除目录。该选项/A用于删除所有与文件属性无关的文件,包括具有隐藏属性集的文件,如果没有选项DEL将不会删除该文件/A/F需要使用option来强制删除具有只读属性集的文件,如果没有option,则不会删除该文件/F该选项/Q用于禁止询问用户是否确实*DEL删除了所有与之匹配的文件

完整的合格目录名称必须用双引号引起来,因为它可能包含空格或这些字符之一,&()[]{}^=;!'+,`~这需要使用"命令的参数字符串,如最后一个帮助页面CMD的帮助所解释的那样,该命令在运行时输出命令提示符窗口cmd /?

请注意,DEL无法删除没有NTFS许可权的用户删除文件或正在由应用程序打开的文件,以防止在打开应用程序时删除文件的方式删除文件。DEL为每个文件输出一条错误消息,由于缺少NTFS或文件访问权限,该文件无法删除。

为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从同一级别的不同目录中删除具有相同名称的子目录

资产目录:访问不同文件夹中具有相同名称的图像

具有相同名称子目录的目录移动

将所有具有相同名称的文件从子目录移动到一个目录中

合并所有子目录中具有相同名称的文本文件,并保留其他文件(删除重复的行)

在所有目录中查找具有相同名称的子目录

如何合并所有子目录中具有相同名称的文本文件?

在文件夹的所有子目录中创建相同的文件夹

Linux将具有相同名称的子目录复制到文件

从子目录连接具有相同名称的csv文件

合并不同文件夹中具有相同名称的文件

在同一目录中列出具有相同名称的文件夹-Delphi

通过名称查找和删除父目录,而没有具有相同名称的子目录

重命名子目录中与文件夹名称相同的文件

R:计算不同子目录/文件夹中具有特定扩展名的文件数

在R的不同子目录中创建相同的文件夹

从多个父文件夹中删除子目录

重命名所有子目录中的文件和文件夹以删除字符

如何将文件复制到编号为 (0001,0002,0003) 的父目录中具有相同名称 (pic) 的子目录

git排除文件夹中除子目录外的所有内容

将一些具有相同名称的文件绑定到R中的不同文件夹中

如何使用终端将文件复制到具有相同名称的特定子目录?

将多个文件移动到具有相同名称的不同文件夹

Shell脚本:当不存在具有相同名称的文件夹时删除文件

如何删除所有子目录中具有给定名称的所有文件?

重命名子目录中具有相同名称和扩展名(通常是.pdf)的文件,编号递增

将不同文件夹中具有相同名称的文件移动到一个文件夹中

删除所有子目录中具有特定名称的文件

具有相同名称但文件夹不同的Windows Phone类