错误地首先将其放到 StackOverflow:
简单的文件搜索,但是却让我困惑。使用命令行,我可以使用以下命令搜索名为 jam 的目录:
dir /AD jam /S
我可以使用以下方法查找名为“三明治”的文件
dir /S *sandwiches* /B
有没有一种快捷方法可以组合这两个命令并查找名为“sandwiches”的文件,但只在名为“jam”的文件夹中?也就是说,无需将所有文件都传输到文本并筛选它们。
答案1
不,通过 Windows 安装提供的常规命令,这是不可能的(afak)。
该命令dir
无法处理“正则表达式”(与 不同findstr
)。因此,建议您将 的输出输入到dir
,findstr
以获取您的选择。
除非有先进的第三方dir
命令可以处理类似于“正则表达式”的东西,否则这可能是显示感兴趣的文件的最简单的变体:
dir /B /S /A-D *sandwiches* | findstr -I ".*jam.*[\\]"
这将列出文件名中包含的所有文件,并在显示列表之前sandwiches
丢弃不包含目录名的任何行。jam
不幸的是,在您的问题中,您排除了所需命令中使用管道的可能性,因此这可能是获取选择的最近/最短的可能性(由 Windows 提供的命令实现),但它不是您条件框架内的解决方案。
答案2
我知道问题是关于“正常”命令行/提示符。但是,您可以尝试使用 Powershell 来获得所需的结果:
Get-ChildItem -Directory "jam" | ForEach-Object { Get-ChildItem -Path $_ | Where-Object { $_.Name -like "*sandwiches*"} | Select-Object Name }
您可以将上述 cmdlet 缩短为:
gci -Directory "jam" | foreach { gci -Path $_ | ? { $_.Name -like "*sandwiches*"} | select Name }
答案3
你可以下载grep对于 Windows 并使用:
dir /s /b | grep -E "jam\\[^\\]*sandwiches[^\\]*"
匹配以 结尾的任何内容,然后匹配jam\
除 之外的任何字符,然后匹配除 之外的任何字符\
sandwiches
\
这是一个比其他答案中管道更少的 PowerShell 解决方案:
Get-ChildItem -Recurse -Directory -Include "jam" | % { Get-ChildItem -Path $_ -Filter "*sandwiches*" -Name }
或者如果您想要完整路径,这更适合递归操作来知道文件在哪里:
Get-ChildItem -Recurse -Directory -Include "jam" | % { Get-ChildItem -Path $_ -Filter "*sandwiches*" | Select FullName }
您还可以通过管道将路径传输至Resolve-Path -Relative
相对路径。