代码之家  ›  专栏  ›  技术社区  ›  Benoit

gnuwin32 find.exe在执行搜索之前展开通配符

  •  17
  • Benoit  · 技术社区  · 14 年前

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

    谢谢你

    5 回复  |  直到 14 年前
        1
  •  17
  •   Benoit    14 年前

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

    • GNUwin32的 find.exe 不适用于最新的Windows版本(Vista,Seven),因为它只扩展与当前目录内容匹配的通配符。
    • 同样,来自unxutils的旧版本find.exe也遇到了同样的错误。
    • The latest find.exe from UnxUtils 正在工作。
        2
  •  16
  •   user117529    11 年前

    一个解决方法是添加一个通配符/扩展,Windows Shell不扩展该通配符/扩展,但gnu find会:

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

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

    然后,find.exe将查找以 .pdf :pdf ,但由于没有文件的名称以 PDF 在Windows下,它只能找到以 PDF .

    [*]实际上是C运行时不执行/不执行这些通配符扩展。我对win32 c运行时的理解不够好,无法进一步区分这一点,因此为了解决这个问题,我现在只说“shell”。

        3
  •  3
  •   zombielei    13 年前

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

    “明格\msys\1.0\bin”

    目录。与说明书一致。

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

    明格的 查找.exe。-名称“gamecli*” 工作。

        4
  •  2
  •   Botz3000 Amir Sheng    13 年前

    我没有找到比回避通配符更好的东西了

    find.exe . -iregex ".+\.pdf" -print
    
        5
  •  0
  •   ghostdog74    14 年前

    @哦,我的行为始终如一

    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 而不是普通人。