使用 cp 将 ~/.config 复制到外部驱动器,但出现“无法创建常规文件...文件存在”错误

使用 cp 将 ~/.config 复制到外部驱动器,但出现“无法创建常规文件...文件存在”错误

/mnt/e该命令非常简单,在外部驱动器的子目录中执行: cp -r ~/.config .。每次,每次我运行它,同一组文件拒绝正确复制:

cp: cannot create regular file './.config/yarn/global/node_modules/ws/lib/validation.js': File exists cp: cannot create regular file './.config/yarn/global/node_modules/ws/lib/websocket.js': File exists cp: cannot create regular file './.config/yarn/global/node_modules/ws/lib/sender.js': File exists cp: cannot create regular file './.config/yarn/global/node_modules/ws/lib/constants.js': File exists cp: cannot create regular file './.config/yarn/global/node_modules/ws/lib/receiver.js': File exists cp: cannot create regular file './.config/yarn/global/node_modules/debug/Readme.md': File exists

执行命令时文件肯定不存在,而且加参数也-f没有什么区别。但是等等,这里变得很奇怪。系统确实会复制文件,但它们最终会具有非常不同的内容。这些差异不能用损坏的副本来解释。如果我运行该 Readme.md 文件的差异:

diff -u ~/.config/yarn/global/node_modules/debug/Readme.md ./.config/yarn/global/node_modules/debug/Readme.md

我在输出中找到这两行:

- Note that PowerShell using different syntax to set environment variables. + Note that PowerShell uses different syntax to set environment variables.

这里发生了什么?!当我运行副本时,就好像我得到了该文件的更新版本。问题是,每次运行该命令时,我都会在该特定文件中得到相同的差异,这毫无意义。

显然我一定有点不知所措。我在以下位置阅读了答案无法创建常规文件“文件名”:文件存在但我不明白。我尝试strace在答案中使用脚本,但我在那里碰壁了(没有创建跟踪文件)。我只是一个穴居人 Linux 用户,我什至没有使用“真正的”Linux,而是使用 WSL(Ubuntu 16.04),所以有人可以用简单的语言解释这里的问题是什么吗?显然,某些过程正在干扰,我可以猜测到这一点,但除此之外我一无所知。

更新:

好的,我确定问题是在源子目录中存在同名但大小写不同的文件(Validation.js、WebSocket.js 等)。问题是,作为 WSL 用户,我正在复制到由 Windows 格式化的驱动器,因此不支持区分大小写的子目录。然而,粗略的研究表明,自 Windows 10 版本 1803(我有)以来,NTFS 文件系统上区分大小写的子目录是可能的。此外,WSL 创建的子目录自动区分大小写(关联):

在适用于 Linux 的 Windows 子系统(Bash shell)中运行的 Linux 工具现在可以创建设置了区分大小写标志的文件夹。因此,无论您使用 mkdir 命令在 Bash shell 内创建目录还是开发工具为您创建目录,创建的目录都会自动设置为区分大小写 — 即使您在安装的 Windows 文件系统上创建它。

我没有在 WSL 中创建目标子目录,因此我将其删除并在 WSL 中重新创建。不过,我的问题仍然存在,尽管它不应该存在。有任何想法吗?

相关内容