我尝试了一些正常的事情:
$ mv path1 path2
mv: cannot move
'path1/subfolder/' to 'path2/subfolder': Permission denied
path2
最初不存在,因此这应该复制 as 的文件夹path1
树path2
。Afind 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
,这使得很难尝试任何故障排除建议。不过,我仍然愿意接受建议。
它应该发生的唯一原因是如果以下两个条件都正确:
path1
并且path2
不在同一个文件系统上。您可以通过运行df path1
和df path2
(或在它们的父文件夹上)来检查这一点,看看它们不在同一个分区上。如果它们都在同一个分区上,那么该mv
命令就不会尝试递归移动整个目录树;它只会重命名path1
为path2
,而不移动子文件和目录。path1
没有用户或组的写权限。您说您对 中的所有文件和文件夹具有读/写权限path1
,但如果您想移动path1
到另一个文件系统,则需要对其path1
本身(或 的父级subfolder
,如果subfolder
它不是直接子级或path
)的写权限。由于您已经删除了
path1
,我们现在无法确认。您说rm
复制后可以访问该文件夹,但是您可能在中间某个时候更改了权限,我无法证明这一点。但你不会有这个问题。一般来说,可能有一些细节你没有告诉我们,一些你可能错过或认为不相关的东西,但同样 - 现在无法确认。特别是因为您已经使用过
cp -r
(它不保留权限,因为您需要-a
或-p
),所以我们再次看不到所有文件和文件夹的原始权限是什么。这确实是一个评论,但空间太有限了。
这些不是一回事。前者将在 path2 中创建一个新目录,其名称对应于 path1 中的最后一个目录名称,并确保它是一个目录。第二个将在 path2/subfilder 中创建 path1/subfilder/ 中所有文件的递归副本。
如果您提供了文件系统权限和您尝试操作的事物的所有权、任何强制访问控制系统的指示以及您期望路径在前后如何定位的示例,那将会很有帮助。