我在使用cygwin64 bash的Win10 / x64下。
复制一个仅包含2个文件的简单目录(下面的../bin)时遇到问题,一个Win10可执行文件和对应的Linux可执行文件(相同的文件名,没有扩展名)。
LoadingRow
为什么不复制abc文件!
如果我在../bin中将abc.exe重命名为abcd.exe,则它可以正常工作并复制2个文件。
如何告诉bash / cp不要将abc和abc.exe视为同一文件?我尝试了各种cp选项(-f,-p,-H),但不能解决问题。
谢谢。
答案 0 :(得分:2)
此问题与Cygwin处理.exe
文件的特殊方式有关。如果当前目录中有一个文件test.exe
,则Cygwin始终允许通过运行./test
而不使用.exe
扩展名来执行该文件。
它在某些系统调用的实现中执行此操作,这些系统调用通过检查是否存在具有相同名称但扩展名为.exe
的文件来取一个文件名,然后对其进行操作。来自Cygwin mailing list上的帖子:
Cygwin始终根据stat(2)透明地处理.exe后缀 通话,但Cygwin 1.7还在以下方面透明地处理它们: open(2)和其他任何调用。因此,如果文件foo.exe存在,并且 应用程序调用stat(“ foo”),它将被告知,是的,“ foo”存在。 这是能够通过bash调用foo.exe的基本组件 输入foo。 POSIX系统只是没有.exe后缀 可执行文件。
但是,这会产生一个问题,如果扩展名为.exe
的文件已经存在,如果您尝试在同一目录中创建没有扩展名的同名文件,则会出现问题。
貌似(根据mailing list帖子),这通常在提取tar文件时发生。对于OP,是在使用cp -r
命令从Windows IDE创建文件的另一个目录中复制时发生的。
解决方法是始终先创建不带扩展名的文件,即创建.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