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
我发现自己解决了我的问题.
find.exe不适用于最近的Windows版本(Vista,Seven),因为它扩展了仅匹配当前目录内容的通配符.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'.