我试图将一个文件夹从一个位置复制到另一个位置。该文件夹大约有 6.4 GB。
所以我做了
cp -r source_folder level1/val
之后,我进入 level1 文件夹并检查:
level1$ ls
val
但是如果我尝试 cd 进入 val,则会出现错误:
level1$ cd val
-bash: cd: val: No such file or directory
而且它似乎也没有复制任何内容:
level1$ du -sh val
0 val
我还用 python 检查了该目录是否存在,但它也说它不存在
>>> import os
>>> os.path.exists('level1/val')
False
我什至无法删除已创建的文件夹:
level1$ rmdir val
rmdir: failed to remove 'val': Not a directory
另一方面,我可以像删除文件一样删除它:
level1$ rm val
level1$ ls
level1$
到底是怎么回事?如何确保正确复制文件夹?
编辑ls -ld source_folder level1/val
添加了返回 的输出
lrwxrwxrwx 1 user1 dinfk 4 Jun 20 12:05 source_folder -> test
drwxr-sr-x 2 user2 systems 4096 Aug 27 19:02 level1/val
答案1
source_folder
- 是引用目录的符号test
链接
但是符号链接中的目录路径是相对的。如果您在符号链接中使用绝对路径(例如/home/user/test
),复制将正常发生。
如果要复制符号链接指向的目录中的所有文件,可以-d
在命令中使用选项cp
。
答案2
显然,val
第一轮副本产生的结果是破损的符号链接。
ls
列出,val
因为它存在:有一个名为 的目录条目val
。cd val
抱怨“没有这样的文件或目录”,因为val
符号链接已损坏。cd
需要访问链接的目标,但目标不存在(这是损坏的符号链接的定义)。du val
显示 0 因为符号链接不使用任何存储空间。 (名称和元数据的空间不计算在内。)os.path.exists
返回False
损坏的符号链接。rmdir val
正确地抱怨这val
不是一个目录,因为它是一个符号链接。rm val
正常删除val
,因为val
文件不是目录。
您报告:
lrwxrwxrwx 1 user1 dinfk 4 Jun 20 12:05 source_folder -> test
该命令cp -r
将符号链接复制为符号链接。由于source_folder
是一个目标为 的符号链接test
,因此这将导致level1/val
成为一个目标为 的符号链接test
。符号链接的目标是一个简单的字符串,它不“跟踪”任何内容。不以 a 开头的符号链接/
是相对的。level1/val
是一个符号链接,其目标是test
so it 指向level1/test
。由于level1/test
不存在,因此符号链接已损坏。
后来你看到:
drwxr-sr-x 2 user2 systems 4096 Aug 27 19:02 level1/val
这次你做了一些不同的事情并复制了目录树。
要复制链接的目标而不是链接本身,您可以使用
cp -r source_folder/ level1/val
尾部斜杠告诉cp
命令对链接指向的目录而不是符号链接本身进行操作。如果参数是目录,则这没有任何区别。
答案3
如果有人似乎也遇到了建议的解决方案不起作用的特定问题:请确保您确实正确拼写了目录名称,并特别注意其名称中的特殊(非 ASCII)字符。
就我而言,我遇到过以下情况:
$ ll
total 68
-rw-r--r-- 1 st_ac131646 st_us-031110 1387 29. Jun 10:02 cu2_o2_nh3_6-1_60.xyz
-rw-r--r-- 1 st_ac131646 st_us-031110 1387 29. Jun 10:03 cu2_o2_nh3_6-2_20.xyz
drwxr-xr-x 2 st_ac131646 st_us-031110 4096 29. Jun 09:17 rḱs
drwxr-xr-x 2 st_ac131646 st_us-031110 4096 29. Jun 13:20 tests
但是当我尝试例如cd rks
或时rmdir rks
,系统总是告诉我不存在这样的文件或目录。我什至可以这样做mkdir rks
,现在突然在ls
输出中出现了第二个具有该名称的目录(正如人们所期望的那样可以访问)。
无论如何,当你仔细观察时,我一定是意外地用 aḱ
而不是常规创建了第一个目录k
,这就是为什么当输入名称为rks
(而不是 rḱs
)时,系统显然告诉我这个目录不存在。
长话短说:仔细检查拼写,并可能尝试从输出中复制粘贴名称ls
。