Эта проблема связана со специальным способом, которым Cygwin обрабатывает файлы .exe
.Если у вас есть файл в текущем каталоге, скажем, test.exe
, Cygwin всегда разрешал его запускать, запуская ./test
без расширения .exe
.
Это делается внутри реализации определенной системы.вызовы, которые принимают имя файла, проверяя, существует ли файл с тем же именем, но с расширением .exe
, а затем работают с ним.Из сообщения в списке рассылки Cygwin :
Cygwin всегда обрабатывал суффикс .exe прозрачно в терминах вызовов stat (2), но Cygwin 1.7 также обрабатывает их прозрачно в терминахopen (2) и любой другой вызов.Следовательно, если файл foo.exe существует и приложение вызывает stat («foo»), ему сообщают, что да, «foo» существует.Это основной компонент, позволяющий вызывать foo.exe из bash, просто набрав foo.Системы POSIX просто не имеют суффикса .exe для исполняемых файлов.
Однако это создает проблему, при которой, если файл уже существует с расширением .exe
, возникнут проблемы, если вы попытаетесь создатьфайл с тем же именем в том же каталоге без расширения.
По-видимому (согласно сообщению список рассылки ), это обычно происходит при извлечении файла tar.В случае OP это происходило при использовании команды cp -r
для копирования из другого каталога, где файлы были созданы в среде IDE Windows.
Обходной путь - всегда сначала создавать файл без расширенияСоздайте файл .exe
.Для этого вместо использования cp -r
можно использовать утилиту pax
, чтобы сначала скопировать не .exe
файлы.Из в исходном каталоге выполните:
find . \! -name '*.exe' -print0 | pax -0drw dest_dir
find . -name '*.exe' -print0 | pax -0drw dest_dir
Обратите внимание, что команда Cygwin find
не поддерживает использование +
с -exec
(что в противном случае использовалось бы дляпредпочтительный способ сделать это).В качестве альтернативы можно использовать GNU cpio
:
find . \! -name '*.exe' -print0 | cpio -p --null dest_dir
find . -name '*.exe' -print0 | cpio -p --null dest_dir