我尝试了一些正常的事情:
$ mv path1 path2
mv: cannot move
'path1/subfolder/' to 'path2/subfolder': Permission denied
最初并不存在,因此这应该复制aspath2
的文件夹树。 A表明我对 中的所有文件和文件夹具有读/写权限。path1
path2
find path1 -ls
path1
最初的diff -qr path1 path2
显示path1/subfolder
没有被移动。但是,我可以递归地复制:
mkdir path2/subfolder
cp -r path1/subfolder/* path2/subfolder
# Confirm that original subtree and copy are identical
diff -qr path1 path2 # Reveals that the two are identical
虽然我已经解决了这个问题,但我对无法解释的行为从来都不满意。有没有简单的方法可以戳戳并刺探原因?我的意思是简单,因为我不编写 Bash 脚本。我只是在命令行中使用它。
我在 Windows 10 上使用 Cygwin。该帐户是非管理员帐户。所有文件和文件夹均归该帐户所有。我确保不存在像 Office 应用程序或 Matlab 这样的僵尸进程,它们可能会以某种方式阻止文件夹被删除,尽管问题很可能是由读取访问或其他原因造成的。正如解决方法所示,它绝对不是对目标树的写访问权限。我也可以rm -r path1
,所以问题也不在于对原始树的写访问。
德拉特。 这意味着我不再拥有path1
,这使得尝试任何故障排除建议变得困难。不过,我仍然愿意接受建议。
答案1
发生这种情况的唯一原因是以下两个条件都正确:
path1
并且path2
不在同一个文件系统上。您可以通过运行df path1
anddf path2
(或在其父文件夹上)来检查这一点,并查看它们不在同一分区上。如果它们都位于同一分区上,则该mv
命令不会尝试递归移动整个目录树;它只会重命名path1
为path2
,而不移动子文件和目录。path1
该用户或组没有写权限。您说您对 中的所有文件和文件夹拥有读/写权限path1
,但如果您想移动path1
到另一个文件系统,则需要对其path1
本身(或 的父级subfolder
,如果subfolder
不是直接子级 或path
)的写入权限。
由于您已经删除了path1
,我们现在无法确认这一点。您说复制后可以访问rm
该文件夹,但您可能在中间的某个时刻更改了权限,我无法证明这一点。但你不会有这个问题。
一般来说,可能有一些您没有告诉我们的细节,一些您可能错过或认为不相关的细节,但同样 - 现在不可能确认这一点。特别是因为您已经使用了cp -r
(它不保留权限,因为您需要-a
或-p
),所以我们再次无法看到所有文件和文件夹的原始权限是什么。
答案2
这确实是一条评论,但空间太有限。
mv path1 path2 ... cp -r path1/subfolder/* path2/subfolder
这些不是同一件事。前者会在path2中创建一个新目录,其名称与path1中的最后一个目录名相对应,假设它是一个目录。第二个将在 path2/subfilder 中创建 path1/subfilder/ 中所有文件的递归副本。
如果您提供了您尝试操作的文件系统权限和所有权、任何现有强制访问控制系统的指示以及您期望路径前后如何运行的示例,那将会很有帮助。
答案3
在 Windows10 中,需要提升权限才能创建或 mv 符号链接。如果 path1 包含符号链接——即使它们属于您的非管理员用户——您将收到来自 的“权限被拒绝”错误mv path1 path2
。