如何使用通配符查找子目录中的文件

时间:2018-02-07 19:13:34

标签: powershell batch-file appveyor

我想在子目录中找到给定文件的所有位置,子目录中可以包含通配符。

在un * x上,我会使用类似的东西:

find ba* -type f -name "foo" -exec dirname {}

不幸的是,我需要在Windows上使用BAT或PowerShell执行此操作(我并不在乎,但我对W32中脚本编写的了解与BAT有关)

到目前为止,我已经提出了

FOR /R bar %f IN (foo*) DO @echo %~pf

但是这不允许在目录参数中使用通配符,例如 FOR /R ba* %f IN (foo*) DO @echo %~pf 无效。

所以我尝试了嵌套循环:

FOR /D %d IN (ba*) DO FOR /R bar %f %d IN (foo*) DO @echo %~pf

但这只会给我一个错误,%f不能在这个地方语法上使用(在德语中:“%f”kann syntaktisch nicht an dieser Stelle verwendet werden )。

背景

我想解决的实际问题是:

AppVeyor中,MinGW安装被隐藏在一些神秘的目录中,如C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1。 而不是逐字地指定这些神秘的路径(最有可能是关于appveyor图像升级的脆弱路径),我想只在我的CI配置中指定类似*x86_64-6.3.*的东西,然后让CI脚本搜索所需二进制文件的路径(例如mingw64-make.exe)并自动将其添加到我的PATH。 在多次匹配的情况下,我想我只是使用找到的路径中的任何一个(例如,第一个或最后一个)。

e.g。类似的东西:

bash$ MINGW_DIR=$(find /c/mingw-w64/${pattern} -type f -name "mingw64-make.exe" -exec dirname {} | tail -1)

RESP:

cmd> FOR /D %d IN (%pattern%) DO FOR /R bar %f %d IN (mingw64-make.*) DO @set %MINGW_DIR%=%~pf

2 个答案:

答案 0 :(得分:3)

如何在子目录中定位文件并将该子目录添加到当前会话的路径(PowerShell)的示例:

$executablePath = Get-ChildItem -Filter mingw64-make.exe -File -Recurse |
  Select-Object -ExpandProperty DirectoryName
if ( $executablePath ) {
  if ( $env:Path[$env:Path.Length - 1] -ne ";" ) {
    $env:Path += ";"
  }
  $env:Path += $executablePath
}

答案 1 :(得分:0)

使用Batch可以执行此操作的方法是使用findstr命令。

批处理文件中的示例:

@echo
findstr /i /s /C:"random" *.*
pause

/i使搜索不区分大小写

/s表示在子目录中搜索

C/:表示搜索此特定字符串

输出格式为:

path {::: {1}}

您也可以将the text containing the string [which may be the whole file]dir合并为:

findstr

以上将递归遍历您的根目录并打印出每个文件的位置[点击空间继续作为暂停执行它在锡上所说的内容]

您可以将for /f "delims=." %%a in ('dir /B /A-D ^| findstr /i /s /C:"random" *.bat') do ( echo "%%a" pause ) 替换为echo %%a,将SET PATH=%PATH%;%%a中找到的路径添加到环境路径

findstr将使用扩展期作为打印/匹配的剪切。没有它你会得到部分文件名。

"delims=."表示它将以裸格式打印当前目录,但不打印文件夹。

[这些示例是为批处理文件设计的]

希望它有所帮助!