Cygwin CP не может скопировать файл "abc", потому что директория назначения.содержит файл "abc.exe" - PullRequest
1 голос
/ 22 сентября 2019

Я нахожусь под Win10 / x64, используя cygwin64 bash.

У меня проблема с копированием простого каталога (ниже ../bin), который содержит только 2 файла, исполняемый файл Win10 и соответствующий исполняемый файл для Linux(то же имя файла без расширения).

$ ls  ../bin
abc  abc.exe*

$ cp -rf ../bin .
cp: cannot create regular file './bin/abc': File exists

$ ls bin
abc.exe*

Почему файл abc не копируется!?

Если я переименую abc.exe в abcd.exe в ../bin, то это сработает, и 2 файла будут скопированы.

Как заставить bash / cp не учитывать abc и abc.exe как тот же файл?Я пробовал различные опции cp (-f, -p, -H), это не решает проблему.

Спасибо.

1 Ответ

2 голосов
/ 22 сентября 2019

Эта проблема связана со специальным способом, которым 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
...