![使用 cp 将 ~/.config 复制到外部驱动器,但出现“无法创建常规文件...文件存在”错误](https://linux22.com/image/157177/%E4%BD%BF%E7%94%A8%20cp%20%E5%B0%86%20~%2F.config%20%E5%A4%8D%E5%88%B6%E5%88%B0%E5%A4%96%E9%83%A8%E9%A9%B1%E5%8A%A8%E5%99%A8%EF%BC%8C%E4%BD%86%E5%87%BA%E7%8E%B0%E2%80%9C%E6%97%A0%E6%B3%95%E5%88%9B%E5%BB%BA%E5%B8%B8%E8%A7%84%E6%96%87%E4%BB%B6...%E6%96%87%E4%BB%B6%E5%AD%98%E5%9C%A8%E2%80%9D%E9%94%99%E8%AF%AF.png)
/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 中重新创建。不过,我的问题仍然存在,尽管它不应该存在。有任何想法吗?