另一个问题来自一位长期使用 Unix/Linux 的用户,他发现自己身处 Windows 世界。首先,让我准确解释一下我要做什么。我正在使用 Windows cmd.exe shell,我想列出当前目录下包含 bin\Debug 层次结构的所有目录,并确定它们是否包含任何文件(例如:尝试弄清楚我的 NAnt clean 目标是否正常工作)。我的层次结构可能看起来像这样:
\Current
\DirA
\bin
\Debug
(some files under debug)
\Release
\DirB
\bin
\Debug
\DirC
\bin
\Release
在 Unix 中,ls */bin/Debug
只会给我一个 中所有内容的列表DirA/bin/Debug
,并向我显示 为空的事实DirB/bin/Debug
。我在 cmd shell 中尝试了不同的方法,但总是得到类似这样的结果:
> 目录 *\bin\Debug 文件名、目录名或卷标语法不正确。 > 目录 *\*\* 文件名、目录名或卷标语法不正确。
关于 dir 命令是否存在一些我不明白的微妙之处,或者它只是在这方面受到限制?
是的,我意识到我可以切换到资源管理器,导航,右键单击,并最终制作一个可以按照我想要的方式进行的搜索,但我对快速而肮脏的命令行解决方案更感兴趣。
答案1
类似这样的操作应该可以满足您的要求。在项目根目录中输入:
c:\path\to\slndir>dir *.dll *.exe /s /b | findstr /i "bin\debug"
Dir 参数:/s - 递归,/b - “裸”,无额外信息
findstr 参数:/i - 忽略大小写
总的来说,“帮助命令' 将显示 shell 命令的帮助。如果不起作用,那么
'命令/?' 一般会显示帮助。
答案2
Windows 不像 Linux 那样使用通配符。只有文件名部分可以包含通配符。
您可以下载适用于 Windows 的 ls 版本并使用它。我使用过赛格威,但我确信还有其他的。
答案3
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ
不太好,但应该可以工作。您也可以将其放入 .cmd 文件中(然后将每个单个 % 替换为双 %%)。或者使用 doskey 定义宏(是的,它仍然存在)。
确保 cmd 扩展已启用。
编辑:怎么运行的:
第一个 for 循环迭代遍历所有子目录(/D 和 /r 开关)。%~fP 扩展为该目录的完整路径。然后,它将 \bin\Debug* 附加到该路径。第二个 for 循环枚举所有匹配的文件。%~ftzaQ 扩展为每个匹配的文件并通过 echo 打印到屏幕上。奇怪的 %~ftzaQ 将其格式化为目录输出。@ 字符避免将命令本身打印在屏幕上。
有关详细信息,请参阅
答案4
您可以执行类似“dir /s *.obj *lib”的操作。它会在最后给出匹配文件数量的摘要。