19

Windows環境でGnuwin32バイナリを使用しています。
特定の種類のファイル、たとえばPDFを検索する場合、通常は次のコマンドを実行します。

find . -iname '*.pdf' -print

これは、どのUNIXシステムでも完全に機能します。

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

ただし、Windowsでは、一重引用符を二重引用符に置き換えたため、現在のディレクトリにpdfファイルがない場合にのみ機能します。それ以外の場合は、*が展開されます。

さらに悪いことに、現在のディレクトリにPDFファイルが1つしかない場合は、それが展開され、構文エラーが発生せず、間違った結果が得られます。

*カレット、バックスラッシュ、スター自体を使用してエスケープし、二重引用符で囲んでみました。何も機能しません。

実際の例:

さて、ここに私のすべてのファイルがあります:

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、Seven)では機能しません。
  • 同様に、UnxUtilsの古いバージョンのfind.exeでも同じバグが発生しました。
  • find.exeUnxUtilsからの最新のものが機能しています。
于 2010-10-22T11:31:16.137 に答える
18

回避策の1つは、Windowsシェルが拡張しないワイルドカード/拡張を追加することですが、GNUfindは次のことを行います。

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

Windowsシェル[*]は中括弧を解釈/拡張しません。さらに、コロンはWindowsファイル名の有効な文字ではないため、このパターンはどのWindowsファイル名とも一致できず、Windowsシェルは常にパターンをfind.exeに渡します。

Find.exeは、.pdfまたは:pdfで終わるファイルを検索しますが、Windowsでは名前で終わるファイルは:pdfないため、で終わるファイルのみが検索されます.pdf

[*]これらのワイルドカード拡張を実行する/実行しないのは実際にはCランタイムです。私はWin32Cランタイムを十分に理解していないため、区別を明確にすることができません。そのため、この回避策の目的のために、今のところ「シェル」と言っています。

于 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

UnxUtilsの代わりにfindutilsを使用してみてください。

于 2010-10-22T09:57:21.170 に答える