Gnuwin32 find.exe расширяет подстановочный знак перед выполнением поиска - PullRequest
17 голосов
/ 22 октября 2010

Я использую двоичные файлы Gnuwin32 в среде Windows.
Когда я хочу найти файлы определенного типа, скажем, PDF, я обычно запускаю:

find . -iname '*.pdf' -print

Это прекрасно работает в любой UNIXsystem.

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

Tспасибо тебе

Ответы [ 5 ]

17 голосов
/ 22 октября 2010

Я нашел решение своей проблемы.

  • Gnuwin32 find.exe не работает с последними версиями Windows (Vista, Seven), поскольку расширяет символы подстановки, соответствующие только содержимому текущего каталога.
  • Аналогично, старая версия find.exe из UnxUtils страдала той же ошибкой.
  • Работает последняя find.exe из UnxUtils .
16 голосов
/ 25 июля 2013

Одним из обходных путей является добавление подстановочного знака / расширения, которое оболочка Windows не раскрывает, но GNU find делает:

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

Оболочка Windows [*] не интерпретирует / не расширяет квадратные скобки. Кроме того, двоеточие не является допустимым символом в именах файлов Windows, поэтому этот шаблон не может соответствовать любому имени файла Windows, и оболочка Windows всегда передает шаблон в файл find.exe.

Find.exe затем найдет любые файлы, заканчивающиеся на .pdf или :pdf, но, поскольку ни один из файлов не может иметь имя, заканчивающееся на :pdf в Windows, он найдет только файлы, заканчивающиеся на .pdf.

[*] Фактически среда выполнения C не выполняет / не выполняет эти подстановочные знаки. Я недостаточно хорошо понимаю среду выполнения Win32 C, чтобы уточнить это различие, поэтому сейчас для целей этого обходного пути я просто говорю «оболочка».

3 голосов
/ 21 мая 2012

Я страдал от этой проблемы сегодня днем. UnxUtils Бенуа может работать. Я также считаю, что MinGW find.exe может работать, он находится под моим

"MinGW \ MSYS \ 1.0 \ Bin"

каталог. И это согласуется с руководством.

gnuwin32 и UnxUtils: find.exe . -name GameCli* работают, но find.exe . -name 'GameCli*' не работает.

Работа MinGW find.exe . -name 'GameCli*'.

2 голосов
/ 05 июня 2012

Я не нашел ничего лучше, чем просто избегать подстановочных знаков

find.exe . -iregex ".+\.pdf" -print
0 голосов
/ 22 октября 2010

@ 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 вместо UnxUtils.

...