cygwin cp无法复制文件“ abc”,因为目标目录。包含文件“ abc.exe”

时间:2019-09-22 10:14:25

标签: bash cygwin cp

我在使用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),但不能解决问题。

谢谢。

1 个答案:

答案 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