19

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

find . -iname '*.pdf' -print

这在任何 UNIX 系统上都能完美运行。

find.exe . -iname "*.pdf" -print

但是在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

良好的行为,通配符未扩展

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

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

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

C:tmp\a>cd ..\b

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

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

谢谢

4

5 回答 5

18

我找到了解决我问题的方法。

  • Gnuwin32find.exe不适用于最近的 Windows 版本(Vista、7),因为它扩展了仅匹配当前目录内容的通配符。
  • 同样,来自 UnxUtils 的旧版本 find.exe 也遇到了同样的错误。
  • find.exeUnxUtils的最新版本正在运行。
于 2010-10-22T11:31:16.137 回答
18

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

find.exe . -name *[.:]pdf -print

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

Find.exe 然后会查找任何以.pdfor结尾的文件:pdf,但由于在 Windows 下没有文件可以具有以结尾的名称:pdf,因此它只会查找以.pdf.

[*] 实际上是 C 运行时执行/不执行这些通配符扩展。我对 Win32 C 运行时的理解不够好,无法细化区别,所以现在为了解决这个问题,我只是说“shell”。

于 2013-07-24T20:36:00.253 回答
3

今天下午我遇到了这个问题。Benoit 的 UnxUtils 可以工作。我还发现 MinGW 的 find.exe 可以工作,它在我的

"MinGW\msys\1.0\bin"

目录。并且与手册一致。

gnuwin32 和 UnxUtils:find.exe . -name GameCli*工作,但 find.exe . -name 'GameCli*'不工作。

MinGW 的find.exe . -name 'GameCli*'作品。

于 2012-05-21T09:50:57.583 回答
2

我没有找到比避免通配符更好的方法

find.exe . -iregex ".+\.pdf" -print
于 2012-06-05T05:30:34.930 回答
0

@OP,我有一致的行为

C:\test\temp>find . -iname "*.txt"
./1.txt
./2.txt

C:\test\temp>cd a

C:\test\temp\a>find . -iname "*.txt"

C:\test\temp\a>cd ..\b

C:\test\temp\b>find . -iname "*.txt"

C:\test\temp\b>find --version
GNU find version 4.2.20
Features enabled: CACHE_IDS D_TYPE

您可能想尝试使用findutils而不是 UnxUtils。

于 2010-10-22T09:57:21.170 回答