Gnuwin32 find.exe расширяет подстановку перед выполнением поиска

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

  •  10-10-2019
  •  | 
  •  

Вопрос

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

find . -iname '*.pdf' -print

Это отлично работает на любой системе UNIX.

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

Но под окнами, заменив отдельные кавычки на двойные цитаты, он работает только тогда, когда в текущем каталоге нет файла 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

Спасибо

Это было полезно?

Решение

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

  • Gnuwin32 find.exe не работает над недавними версиями Windows (Vista, семь), потому что он расширяет подстановочные знаки, соответствующие только содержанию текущего каталога.
  • Точно так же старая версия find.exe из Unxutils пострадала от той же ошибки.
  • Последний find.exe от Unxutils работает.

Другие советы

Один обходной путь - добавить подстановку/расширение, которое оболочка Windows не расширяется, но GNU Find делает:

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

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

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

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

Я перенес эту проблему сегодня днем. Бенуатские 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 вместо Unxutils.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top