列出具有指定名称的所有子目录

Posted

技术标签:

【中文标题】列出具有指定名称的所有子目录【英文标题】:Listing all subdirectories with a specified name 【发布时间】:2012-04-17 01:46:33 【问题描述】:

我正在尝试获取具有某些指定名称的所有子目录(递归)的路径列表,例如"bin"。问题是如果当前目录包含该名称的子目录,则 DIR 命令将仅在该子目录中执行,而忽略其他子目录。

例子:

C:\DEVELOPMENT\RESEARCH>ver

Microsoft Windows [Version 6.1.7601]

C:\DEVELOPMENT\RESEARCH>dir *bin* /ad /s /b
C:\DEVELOPMENT\RESEARCH\bin
C:\DEVELOPMENT\RESEARCH\Apache\2bin
C:\DEVELOPMENT\RESEARCH\Apache\bin
C:\DEVELOPMENT\RESEARCH\Apache\bin1
C:\DEVELOPMENT\RESEARCH\C#\ConsoleApps\MiscTests\bin

C:\DEVELOPMENT\RESEARCH>dir bin* /ad /s /b
C:\DEVELOPMENT\RESEARCH\bin
C:\DEVELOPMENT\RESEARCH\Apache\bin
C:\DEVELOPMENT\RESEARCH\Apache\bin1
C:\DEVELOPMENT\RESEARCH\C#\ConsoleApps\MiscTests\bin

C:\DEVELOPMENT\RESEARCH>dir bin /ad /s /b
C:\DEVELOPMENT\RESEARCH\bin\test    

C:\DEVELOPMENT\RESEARCH>rmdir bin /s /q

C:\DEVELOPMENT\RESEARCH>dir bin /ad /s /b
C:\DEVELOPMENT\RESEARCH\Apache\bin
C:\DEVELOPMENT\RESEARCH\C#\ConsoleApps\MiscTests\bin

C:\DEVELOPMENT\RESEARCH>

dir *bin* /ad /s /b 输出名称中包含bin 的所有子目录。这个输出没问题。与dir bin* /ad /s /b 相同,它输出名称以bin 开头的所有子目录。但是dir bin /ad /s /b 只输出当前目录的第一个子目录的内容,名称为bin。期望的输出是:

C:\DEVELOPMENT\RESEARCH\bin
C:\DEVELOPMENT\RESEARCH\Apache\bin
C:\DEVELOPMENT\RESEARCH\C#\ConsoleApps\MiscTests\bin

我怎样才能做到这一点?

注意:如果当前目录不包含bin child,则输出如预期。 (我删除了binchild 来显示这个)

【问题讨论】:

【参考方案1】:

如果您的当前目录包含bin 子目录,则很难使用标准的 DOS 命令。我认为您有三个基本选择:

# Option 1: FOR and check directory existance (modified from MBu's answer - the
# original answer just appended 'bin' to all directories whether it existed or not)
# (replace the 'echo %A' with your desired action)
for /r /d %A in (bin) do if exist %A\NUL echo %A

# Option 2: PowerShell (second item is if you need to verify it is a directory)
Get-ChildItem -filter bin -recurse
Get-ChildItem -filter bin -recurse |?  $_.Attributes -match 'Directory' 

# Option 3: Use UNIX/Cygwin find.exe (not to be confused in DOS find)
# (you can locate on the net, such as GNU Utilities for Win32)
find.exe . -name bin
find.exe . -name bin -type d
DOS Testing if drive or directory exists Cygwin GNU Utilities for Win32

【讨论】:

选项 1 完成了这项工作。我实际上正在编写一个简短的脚本,用于删除具有给定名称的子目录。我将您的答案(所以会接受)与其他一些命令结合起来,得到了我想要的。非常感谢! 选项 1 - 在带有 NUL 的 Vista 中不起作用。保留 \ 但删除 NUL,它可以在 Vista 中使用。另外,应该使用引号。如果存在 "%A\" @dbenham 引用的好点。不过,我对 NUL 不能在 Vista 上工作感到惊讶。我在 Win7 和 Win2008 上进行了测试,并且它工作正常,并且文章(DOS 测试如果驱动器...)指的是 Win 3.11,所以我预计它几乎适用于所有情况。 嗯,我刚刚在 Vista 上尝试了 NUL,它运行良好。但我发誓我在家里的 Vista 64 上试过,但失败了。我回家后会再检查一遍。我知道检查folder\nul 的存在是MS-DOS 中的一种标准技术。但我记得得知 Windows 引入了一些复杂性,使其在某些情况下不可靠——我只是不记得细节了。【参考方案2】:

这应该可行:

for /R /D %A in (*bin*) do echo %A

【讨论】:

以上是关于列出具有指定名称的所有子目录的主要内容,如果未能解决你的问题,请参考以下文章

ls -用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)

linux:基本指令

linux:基本指令

Linux指令(基础)

Mac - 列出目录及其子目录中的所有图像路径(名称)

ls命令