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

cygwin cp can't copy file "abc" because destination dir. contains file "abc.exe"

我正在 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没有被复制!?

如果我在 ../bin 中将 abc.exe 重命名为 abcd.exe,那么它会起作用,并且会复制 2 个文件。

如何告诉 bash/cp 不要将 abc 和 abc.exe 视为同一个文件?我尝试了各种 cp 选项(-f、-p、-H)都没有解决问题。

谢谢。

此问题与 Cygwin 处理 .exe 文件的特殊方式有关。如果你的当前目录中有一个文件,比如 test.exe,Cygwin 总是允许它由 运行 ./test 执行而没有 .exe 扩展名。

它在某些系统调用的实现中执行此操作,这些系统调用通过检查是否存在具有相同名称但具有 .exe 扩展名的文件来获取文件名,然后对其进行操作。来自 Cygwin 上的 post mailing list:

Cygwin always handled the .exe suffix transparently in terms of stat(2) calls, but Cygwin 1.7 also handles them transparently in terms of open(2) and any other call. Therefore, if a file foo.exe exists, and an application calls stat("foo"), it will get told that, yes, "foo" exists. That's a basic component of being able to call foo.exe from bash by just typing foo. POSIX systems just don't have the .exe suffix for executables.

但是,这会产生一个问题,如果扩展名为 .exe 的文件已经存在,如果您尝试在同一目录中创建同名文件而不带扩展名,则会出现问题。

表面上(根据 mailing list post),这通常发生在提取 tar 文件时。在 OP 的情况下,当使用 cp -r 命令从文件由 Windows IDE.

创建的不同目录复制时发生

解决方法是始终先创建不带扩展名的文件,然后再创建 .exe 文件。为此,可以使用 pax 实用程序先复制非 .exe 文件,而不是使用 cp -r。从 源目录 中,执​​行:

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