Gnuwin32 find.exe расширяет подстановку перед выполнением поиска
Вопрос
Я использую двоичные файлы 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.