我一直使用该命令将我的主目录备份到外部硬盘上cp -r
。
直到最近,它还运行良好,但现在我经常会收到错误消息,cp: cannot create regular file
后跟invalid argument
或。cp: cannot create symbolic link
operation not permitted
我尝试过sudo cp -r
,但问题仍然存在。我做错了什么?
答案1
源文件名和目标文件系统之间的冲突可能会导致cannot create regular file
错误。如果您要复制到 USB 拇指驱动器,则可能使用 vfat 或 fat32 文件系统,这受通常的Windows 命名限制。
为了观察这一点,请尝试创建一个名为的文件:
,它是 Windows 保留字符。
$ cp /dev/null /path/to/dest/:
cp: cannot create regular file '/path/to/dest/:': Invalid argument
要单独查看Operation not permitted
错误,请尝试创建不带复制的符号链接。
$ ln -s somesillysymlink /path/to/dest/symlink
ln: failed to create symbolic link '/path/to/dest/symlink': Operation not permitted
如果您看到这些错误,那么这很可能就是问题的原因。
最简单的方法可能是创建一个不受您遇到的命名限制的存档,同时保留符号链接。默认情况下,tar
并7z
保留符号链接。zip
使用适当的标志保留符号链接。这些中的每一个都可以存储名称中包含 Windows 保留字符的文件。另请参阅“我如何压缩符号链接?”
将 vfat 文件系统替换为更适合 Linux 的文件系统(例如 ext4)可以缓解您的问题,但代价是可移植性降低。几乎任何 Linux 系统都能够安装该驱动器,但其他常见系统则需要额外的工作。请参阅“从控制台创建 ext4 分区” 和mke2fs
手册页,了解创建过程的详情。请参阅“如何在 Windows 上读取 ext4 分区?”,“如何在 OS X 上安装 ext4 文件系统?“, 和 ”如何使用 OS X Fuse 挂载 Ext4“如果您需要将该驱动器移动到其他操作系统。
答案2
cp -rv
至少应该告诉您它在哪个文件上出现问题。
您遇到的问题听起来像是您正在将符号链接(即指向另一个文件的文件)复制到不支持符号链接的文件系统。对此有三种选择:
将备份卷转换为接受符号链接的文件系统(例如将其从 FAT 或 NTFS 重新格式化为 EXT3 或 EXT4)。这可能会很麻烦,具体取决于您那里有多少数据(您可能需要在执行此操作时处理这些数据)。
只需忽略符号链接而不复制它们。如果您尝试恢复,这可能会破坏某些文件,因为它会丢失一些文件。
扩展符号链接,使其包含实际数据的副本。这会占用更多空间。
第一个是我的选择,但如果您需要另一个不支持 EXTx 卷的系统驱动器,那就有问题了。
无论后两个选项是否可行,我都会cp
使用其详细标志来查看您要处理的是什么。如果是单个文件,也许普通副本就可以了,如果不是,并且它只是一个垃圾助手,也许省略它就可以了。
但顺便说一句,大多数人似乎更喜欢使用它rsync
来备份。它有很多选项,非常适合这项工作。您可以阅读它的手册页在这里。它有多种处理符号链接的选项(如上所述)。
答案3
看看你的dmesg
。通常的问题是文件系统问题或硬盘故障(因此是文件系统问题)。
您可以卸载外部磁盘然后运行fsck
。例如
umount /dev/sdb1
fsck -f /dev/sdb1
答案4
我刚刚遇到了同样的问题(实际上是在 Cent OS 上通过 VirtualBox 遇到的),问题与权限有关。我与本地计算机(OSX Mavericks 上的 Mac)共享了一个目录,尝试了,cp
但它却无法访问Protocol error
。在我的本地计算机上,我将目录的所有者更改为普通用户(我)(从root
),并将组更改为比更通用的组wheel
。所以,结果是一个基本的权限问题。