gnuwin32 find.exe在执行搜索之前扩展通配符
题
我在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。