gnuwin32 find.exeは、検索を実行する前にワイルドカードを展開します

StackOverflow https://stackoverflow.com/questions/3995493

  •  10-10-2019
  •  | 
  •  

質問

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

ありがとうございました

役に立ちましたか?

解決

私は自分の問題の解決策であることに気付きました。

  • Gnuwin32's find.exe 現在のディレクトリの内容のみに一致するワイルドカードを拡張するため、最近のWindowsバージョン(Vista、7)では動作していません。
  • 同様に、UnxutilsのFind.exeの古いバージョンは同じバグに苦しんでいました。
  • 最新の find.exe unxutilsから 仕事中。

他のヒント

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

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

Windows Shell [*]は、正方形のブレースを解釈/拡張しません。さらに、コロンはWindowsファイル名の有効な文字ではないため、このパターン できません Windowsのファイル名を一致させると、Windowsシェルは常にパターンを渡してfind.exeを渡します。

Find.exeは、で終了するファイルが見つかります .pdf また :pdf 、しかし、ファイルがないので、 :pdf Windowsの下では、で終わるファイルのみが見つかります .pdf.

*]実際には、これらのワイルドカード拡張を実行/実行しないのはCランタイムです。 Win32 Cランタイムが区別を改善するのに十分なほどよくわかりませんので、今のところこの回避策の目的のために、「シェル」と言っています。

今日の午後、私はこの問題に苦しんだ。 BenoitのUnxutilsは機能します。また、MingwのFind.exeが機能する可能性があると思います。それは私の下にあります

「mingw msys 1.0 bin」

ディレクトリ。そして、それはマニュアルと一致しています。

gnuwin32とunxutils: find.exe . -name GameCli* 仕事、しかし find.exe . -name 'GameCli*' うまくいきません。

Mingw's 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

使用しようとするかもしれません findutils xutilsの代わりに。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top