如何使用正确的shell转义字符从PowerShell调用msys2 find命令?

时间:2017-08-30 18:10:03

标签: powershell msys2

我想知道如何从PowerShell中逃避以下命令以便它能够正常工作?

PS C:\Users\buster\Documents\> find -name \*.c 

PowerShell说:找不到错误* .c

PS C:\Users\buster\Documents\> find -name *.c 

PowerShell说:找不到错误* .c

2 个答案:

答案 0 :(得分:1)

如果您使用find(没有完整路径),则最有可能使用Windows附带的find.exeC:\Windows\system32\find.exe),这更类似于{{1}而不是Unix grep。您得到该行为是因为Windows在find中搜索具有给定名称的文件中的所有目录(如果未指定扩展名,则在$env:PATH中列出一个扩展名),并执行第一个匹配。由于$env:PATHEXT通常位于PATH的开头,因此可执行文件优先。

您可以将%windir%\system32添加到PATH的开头(C:\msys64\msys64\usr\bin之前),但我不建议这样做。更好的方法是为命令定义alias

%windir%\system32

别名优先于文件。您可以将别名定义放在PowerShell profile中,以便在启动PowerShell时自动加载它。

或者你可以简单地使用New-Alias -Name 'find' -Value 'C:\msys64\msys64\usr\bin\find.exe' ls -r -fi '*.c'的缩写),这将是PowerShell方式。

答案 1 :(得分:0)

好误报..

显然,这是一个Windows的例子,其中一个可执行文件与msys2的c:\ windows \ system32下的find.exe同名,而windows命令在路径列表中获得更高的优先级。在明确键入到findys的msys64版本的完整路径之后,它可以正常工作。

PS C:\Users\buster\Documents\> C:\msys64\msys64\usr\bin\find -name \*.c

此外,有一个更好的方法来查找cmd.exe原生的* .c文件,您可以从PowerShell调用这样的文件:

PS C:\Users\buster\Documents\> cmd /c dir /S /B *.v