ls 显示目录但无法访问

ls 显示目录但无法访问

我试图将一个文件夹从一个位置复制到另一个位置。该文件夹大约有 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是一个符号链接,其目标是testso 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

相关内容