【问题标题】:cygwin cp can't copy file "abc" because destination dir. contains file "abc.exe"cygwin cp 无法复制文件“abc”,因为目标目录。包含文件“abc.exe”
【发布时间】:2019-09-22 10:14:25
【问题描述】:

我在 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 的一个特性。他们必须绕过这样一个事实,即 Windows 上的可执行文件必须具有 .exe 扩展名,但 Unix 可执行文件通常没有扩展名。因此,带有.exe 扩展名的文件和另一个具有相同名称但没有扩展名的文件被 Cygwin 视为同一个文件。首先将这两个文件放在bin 目录中可能不是一个好主意,因为它只会混淆Cygwin。但如果你真的想复制,最简单的方法可能就是使用 Windows 资源管理器。
  • 请注意,.exe 必须是真正的 Windows 可执行文件才能重现该问题。我使用 "ls > xyz; chmod a+x xyz" 在 ../bin "xyz" 和 "xyz.exe" 中创建了 2 个虚拟文件,然后没有出现问题。
  • @Graeme。是的,它必须是 cygwin,但我认为可能有办法改变这种行为?这是自动构建过程的一部分,因此无法手动复制。一种解决方法显然是重命名 ./bin 中的 .exe 文件以避免名称冲突,但我无法完全控制此构建过程...
  • 也许做不同的文件夹? binwin32win64 什么的?

标签: bash cygwin cp


【解决方案1】:

这个问题与 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 文件。为此,可以先使用pax 实用程序复制非.exe 文件,而不是使用.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

【讨论】:

  • 因为这个问题我不得不停止使用 cygwin git。当你在同一个 repo 文件夹中有 filefile.exe 时,它会变得非常暴躁。
猜你喜欢
  • 2015-03-28
  • 2020-10-21
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多