在执行搜索之前,Gnuwin32 find.exe会扩展通配符

Ben*_*oit 17 find gnuwin32 expansion

我在Windows环境中使用Gnuwin32二进制文件.
当我想查找某种类型的文件时,我们说PDF,我通常运行:

find . -iname '*.pdf' -print
Run Code Online (Sandbox Code Playgroud)

这适用于任何UNIX系统.

find.exe . -iname "*.pdf" -print
Run Code Online (Sandbox Code Playgroud)

但是在Windows下,用双引号替换了单引号,它只在当前目录中没有pdf文件时才有效,否则*会扩展.

更糟糕的是:当前目录中只有一个PDF文件,它会扩展,没有语法错误,你会得到错误的结果.

我试着*用一个插入符号,一个反斜杠,一个明星本身,用双引号来避开它:对我来说没什么用.

真实的例子:

好的,这是我的所有文件:

C:\tmp>find . -type f
./a/1.pdf
./a/2.pdf
./a/aa/1.pdf
./b/1.pdf
./b/bb/1.pdf
./b/bb/2.pdf
Run Code Online (Sandbox Code Playgroud)

良好的行为,通配符没有扩大

C:\tmp>find . -iname "*.pdf"
./a/1.pdf
./a/2.pdf
./a/aa/1.pdf
./b/1.pdf
./b/bb/1.pdf
./b/bb/2.pdf

C:\tmp>cd a
Run Code Online (Sandbox Code Playgroud)

注意,不一致的行为,扩展了通配符:

C:\tmp\a>find . -iname "*.pdf"
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

C:tmp\a>cd ..\b
Run Code Online (Sandbox Code Playgroud)

注意,不一致的行为,扩展了通配符:

C:\tmp\b>find . -iname "*.pdf"
./1.pdf
./bb/1.pdf
Run Code Online (Sandbox Code Playgroud)

谢谢

Ben*_*oit 17

我发现自己解决了我的问题.

  • Gnuwin32 find.exe不适用于最近的Windows版本(Vista,Seven),因为它扩展了仅匹配当前目录内容的通配符.
  • 同样,来自UnxUtils的旧版本的find.exe遭遇了同样的错误.
  • find.exeUnxUtils 的最新版本正在发挥作用.


use*_*529 16

一种解决方法是添加Windows shell不扩展的通配符/扩展,但GNU find会:

find.exe . -name *[.:]pdf -print
Run Code Online (Sandbox Code Playgroud)

Windows shell [*]不解释/扩展方括号.此外,冒号不是Windows文件名中的有效字符,因此此模式无法与任何Windows文件名匹配,并且Windows shell将始终将模式传递给find.exe.

然后Find.exe将找到以.pdf或结尾的任何文件:pdf,但由于没有文件的名称以:pdfWindows 结尾,因此它只会找到以.pdf.结尾的文件.

[*]它实际上是C运行时执行/不执行这些通配符扩展.我不太了解Win32 C运行时以完善区别,所以为了解决这个问题,我现在只是说'shell'.