我在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

谢谢

有帮助吗?

解决方案

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

  • gnuwin32 find.exe 不使用最近的Windows版本(Vista,七个),因为它扩展了仅匹配当前目录的内容的通配符。
  • 同样,Unxutils的旧版本的find.exe也遭受了同样的错误。
  • 最新的 find.exe 来自Unxutils 正在工作中。

其他提示

一个解决方法是添加Windows Shell不会扩展的通配符/扩展,但GNU发现确实如此:

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

Windows Shell [*]不会解释/扩展方形支架。此外,结肠不是Windows文件名中的有效字符,因此此模式 不能 匹配任何Windows文件名,Windows Shell将始终将模式传递到find.exe。

然后find.exe然后找到任何结尾的文件 .pdf 或者 :pdf ,但是由于没有任何文件可以在 :pdf 在Windows下,它只会找到结尾的文件 .pdf.

*]实际上是C运行时可以/不执行这些通配符扩展。我不太了解Win32 C的运行时间足以完善区别,因此,就此目的而言,我只是说“ Shell”。

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

“ mingw msys 1.0 bin”

目录。它与手册一致。

gnuwin32和unxutils: find.exe . -name GameCli* 工作,但是 find.exe . -name 'GameCli*' 不起作用。

明格的 find.exe . -name 'GameCli*' 工作。

我没有发现任何比避免通配符角色更好的东西

find.exe . -iregex ".+\.pdf" -print

@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

您可能想尝试使用 找到 而不是Unxutils。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top