Windows等效于ls *(星号)目录通配符?


14

一个长期使用Unix / Linux的用户提出的另一个问题,他发现自己身处Windows世界。首先,让我确切说明我要做什么。我使用的是Windows cmd.exe Shell,我想列出当前目录下包含bin \ Debug层次结构的所有目录,并确定它们是否包含任何文件(例如:尝试确定我的NAnt清理目标是否为好好工作)。我的层次结构可能看起来像这样:

\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外壳中尝试了不同的扭曲,但是不断出现类似以下内容:

    >目录* \ bin \ Debug
    文件名,目录名称或卷标签语法不正确。

    >目录* \ * \ *
    文件名,目录名称或卷标签语法不正确。

关于dir命令,我是否有些不明白的地方?

是的,我意识到我可以切换到资源管理器,进行导航,右键单击,并且最终可能会进行符合我想要的搜索,但是我对快速N肮脏的命令行解决方案更感兴趣。


尽管很高兴知道我可以添加到Windows的所有类似Unix的工具(并相信我在家中使用Cygwin!),但无论到哪里我都不会总是可用它们(实际上可能没有管理权限)将它们安装在我使用的每台PC上)。
Ogre Psalm33,2009年

Answers:


13

这样的事情应该做你想要的。在项目的根目录中,输入:


c:\path\to\slndir>dir *.dll *.exe /s /b | findstr /i "bin\debug"

dir参数:/ s-递归,/ b-“裸”,没有多余的信息
findstr参数:/ i-忽略大小写

通常,“帮助命令 ”将显示shell命令的帮助。如果那行不通,请使用
命令 /?” 通常会显示帮助。


优秀!我意识到那里有很多工具/工具包可以帮助我“ Linux化”我的Windows,但是我一直在寻找Windows可以完成我想做的事情的方式,这就是事实!
Ogre Psalm33,2009年

7

Windows不像Linux那样做通配符。只有文件名部分可以包含通配符。

您可以下载Windows上运行的ls版本并使用它。我用过Cygwin,但是我敢肯定还有其他人。


以及PowerShell
Joel Coehoorn

3
要记住的另一件事:在Windows中,通配符通过命令而不是Shell进行扩展。
劳伦斯·贡萨尔维斯

2

unxutils有一个ls命令。但是,问题确实出在Windows Shell上。在unix上,您的shell将扩展*/bin/Debug为相关的路径名,并将它们作为单独的命令行参数提供给ls命令。

Cygwin当然可以为您解决问题,或者您可以尝试使用unix外壳程序的Windows端口(例如bash)。如果您想走脚本路线,则可以使用glob模块轻松地在python中编写代码,大多数其他脚本语言都具有等效功能。


2

您可以执行类似“ dir / s * .obj * lib”的操作。它将在末尾给出一个摘要,说明有多少个文件匹配。


关。我给了你道具,但是詹姆斯的答案更近了,因为它为我过滤掉不在 \ debug下的文件。
Ogre Psalm33,2009年

2
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

不好,但是应该可以。您也可以放入.cmd文件(然后将每个%替换为double %%)。或使用doskey定义宏(是的,它仍然存在)。

确保已启用cmd扩展名。

编辑:它是如何工作的:

第一个for循环迭代遍历所有子目录(/ D和/ r开关)。%〜fP扩展到该目录的完整路径。然后,它将\ bin \ Debug *附加到该路径。第二个for循环枚举所有匹配的文件。%〜ftzaQ会扩展到每个文件匹配项,并通过回显将其打印到屏幕上。奇怪的%〜ftzaQ将其格式化为目录输出。@字符可避免将命令本身打印在屏幕上。

有关更多信息,请参见


我试过了,确实可以。但是由于对cmd shell缺乏经验,我还不太了解这一切:-)。
Ogre Psalm33,2009年

0

在Windows世界中,cmd.exe不会扩展通配符-通配符将按原样传递到其命令行或argv数组中的程序。因此,每个程序都以不同的方式解析和扩展它们,并且通常不支持某些更高级的用法(如您正在寻找的)。

timgilbert提出的使用Cygwin 的建议是一个很好的建议GNUWin32软件包也可能会帮助您。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.