为什么“ls”只在我位于某个目录时显示内容?

为什么“ls”只在我位于某个目录时显示内容?

我面临着一种非常令人困惑的行为,ls我无法搜索。它显示目录中有内容,但仅当我位于创建这些内容的目录中时。

我来给你展示:

ciprian Documents $ pwd
/Users/ciprian/Documents

ciprian Documents $ ls ../Downloads/rss22/
22rss-USB/

ciprian Documents $ ls ../Downloads/rss22/22rss-USB/
HTML/

ciprian Documents $ cd ../Downloads/rss22

ciprian rss22 $ ls

ciprian rss22 $ ls 22rss-USB/
gls: cannot access '22rss-USB/': No such file or directory

cd我ed to后../Downloads/rss22,其内容显示为空。如果 Icd ~/Desktop然后 I ,它也会显示为空ls ../Downloads/rss22/,就像这里的第一种情况一样。

对我来说,这表明可能有一个名为../Downloads/rss22 里面 Documents。但我不知道如何显示它。ls -a ~/Documents不显示与这些文件夹相关的任何内容。

到底是怎么回事?

这些文件是通过尝试从存档中部分提取来创建的:unzip 22rss-USB.zip "22rss-USB/HTML/**/*" -d ../Downloads/rss22/

作为参考,我在苹果系统,尽管我认为这无关紧要(它是 Unix,对吧?)。我正在使用 Bash 5.1.16(从默认的 zsh 更改)。

: pwd的输出type pwd是 shell 内置命令。

事实证明,如果我cd -P ../Downloads/igarss22/这样做,它就会显示我期望的内容。我在哪里可以看到更多相关信息?man cd没有显示任何关于 的内容-P

现在,之后cd -P ../Downloads/igarss22/

ciprian Documents $ cd -P ../Downloads/igarss22

ciprian igarss22 $ pwd
/Users/ciprian/Library/CloudStorage/OneDrive/Downloads/igarss22

正确的。所以我忘记了这一点; my~/Documents是指向我的 OneDrive 下的文件夹的符号链接:

$ ll ~/ | grep Doc
lrwxr-xr-x    1 ciprian   38 May 19  2022 Documents -> /Users/ciprian/OneDrive/Documents

其中,由于一些魔法和变化macOS v12(蒙特雷),实际上生活在/Users/ciprian/Library/CloudStorage/OneDrive.

我还是不确定到底发生了什么

答案1

区别在于物理处理与逻辑处理..

您显然有两个单独的Downloads目录:

  • 一个是/Users/ciprian/Downloads
  • 另一个是/Users/ciprian/Library/CloudStorage/OneDrive/Downloads

某些 shell(包括bash所有 POSIX shell)可以选择..在命令中将cd其视为“完全按照用户表达的方式获取当前路径,切断最右侧的元素并更改为结果路径”。通过符号链接,这将作为逻辑“返回到我们来自的地方”,从/Users/ciprian/Library/CloudStorage/OneDrive/Documents(符号链接到,并由用户称为~/Documents)返回到/Users/ciprian(因此此时的新路径只是~),然后从那里返回到/Users/ciprian/Downloads。如果您使用cd -L,这就是您将得到的明确行为。

其他程序通常不会这样做:它们将遵循物理路径,因此对于它们来说,将目录更改为从../Downloads开始/Users/ciprian/Library/CloudStorage/OneDrive/Documents将始终意味着更改为/Users/ciprian/Library/CloudStorage/OneDrive/Downloads.这也是您将得到的cd -P

如果您不喜欢 shell 的这个(错误)功能,可能有一种特定于 shell 的方法可以禁用它。对于bashshell,将set -P或添加set -o physical到您的~/.bashrc或类似的 shell 启动脚本将使bash所有cd命令的行为都具有该选项,除非显式使用-P该选项。-L

笔记。的文档-P位于man bash(SHELL BUILTIN COMMANDS 部分),因为cd它是 Bash 的内部命令。

答案2

另一种可能性与 OneDrive 相关文件点播文件夹重定向选项,可在 MacOS 和 Windows 上使用,但可能仅限于 OneDrive for Business。

这两个选项都提供了删除 One Drive 启用的目录树中文件夹和文件的本地副本的功能,以节省本地卷上的空间。

本地文件可以手动通过使用 One Drive 客户端中提供的“清除空间”操作来删除,但我相信上述一项或两项功能将删除 3 个月内未访问过的文件/文件夹的本地副本。

指向此类资源的云副本的指针将被保留,并且当使用本机文件管理应用程序(例如 Explorer/Finder)或 OneDrive 客户端访问时,OneDrive 将执行即时下载以使它们在本地可用。

问题是,这不适用于大多数 *nix shell,它会列出仅作为云指针存在的文件和文件夹,但在对它们执行操作(例如打开文件或遍历目录)时不会触发同步。

这是我在 WSL 中从 bash shell 访问启用 OneDrive for Business 的目录时经常遇到的问题。

此类文件和文件夹需要重新同步回本地设备你需要在 shell 中处理它们或者你应该使用始终保持在此设备上选项以确保它们在本地可用并且不会为了优化空间而被删除。

相关内容