我面临着一种非常令人困惑的行为,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 的方法可以禁用它。对于bash
shell,将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。
- https://support.microsoft.com/en-us/office/save-disk-space-with-onedrive-files-on-demand-for-mac-529f6d53-e572-4922-a585-e7a318c135f0
- https://learn.microsoft.com/en-us/sharepoint/redirect-known-folders-macos
这两个选项都提供了删除 One Drive 启用的目录树中文件夹和文件的本地副本的功能,以节省本地卷上的空间。
本地文件可以手动通过使用 One Drive 客户端中提供的“清除空间”操作来删除,但我相信上述一项或两项功能将删除 3 个月内未访问过的文件/文件夹的本地副本。
指向此类资源的云副本的指针将被保留,并且当使用本机文件管理应用程序(例如 Explorer/Finder)或 OneDrive 客户端访问时,OneDrive 将执行即时下载以使它们在本地可用。
问题是,这不适用于大多数 *nix shell,它会列出仅作为云指针存在的文件和文件夹,但在对它们执行操作(例如打开文件或遍历目录)时不会触发同步。
这是我在 WSL 中从 bash shell 访问启用 OneDrive for Business 的目录时经常遇到的问题。
此类文件和文件夹需要重新同步回本地设备前你需要在 shell 中处理它们或者你应该使用始终保持在此设备上选项以确保它们在本地可用并且不会为了优化空间而被删除。