网络 SMB 共享上 Finder (OSX) 中的灰色文件夹

网络 SMB 共享上 Finder (OSX) 中的灰色文件夹

请耐心听我说,这篇文章很长而且很复杂,但是 TL;DR OSX 在哪里隐藏文件的额外属性(在共享或本地)?

我们的企业环境存在问题。我们有一个 Oracle ZFS 设置,并且我们的 OSX 机器正在 SMB 安装卷。

用户尝试在两个位置之间移动文件夹,但中途取消了此操作,导致两个位置的文件夹都变灰。在 Finder 中,文件夹的创建和修改日期显示为 06/13/1943 06:13:00。当我们从 Linux 工作站查看文件时,它会显示正确的创建和修改日期。然后,我们从 Linux 工作站或 OSX 工作站触摸该文件,通过终端我们可以看到该文件夹​​,甚至可以使用该文件夹的打开命令。但通过 Finder 它保持灰色,无法打开。这影响了访问此文件的所有 OSX 工作站。它们都看不到它,但 Windows 和 Linux 没问题。

我们最终使用已弃用的 GetFileInfo 和 SetFile 命令来解决这个问题。

我对社区的问题是,这些属性存储在哪里,因为使用 ls -la 或 stat 时无法在文件上看到它们。但是当我们使用 GetFileInfo 查看时,它们就在那里。有人知道 OSX 是否会进行一些奇怪的 Samba 缓存并将其存储在服务器上吗?或者将其放在一个愚蠢的 .DS_Store 文件中?

帮忙!!!请

答案1

OS X 有几种方法可以将其额外元数据存储在本身不支持它们的卷上:

  • 在 FAT 卷之类的东西上,它会将元数据存储为一个单独的文件,文件名带有“._”前缀,使用苹果双格式。例如,如果原始文件为“somefile.txt”,而您将其复制到 FAT32 卷,则数据将被复制到“somefile.txt”,元数据将保存为“._somefile.txt”。

  • 在通过 SMB 安装的 NTFS 卷上(如果存在某些我不完全理解的条件),它会将元数据存储为NTFS 备用数据流

我不确定您的 Oracle 服务器的 SMB 实现是否支持备用数据流,但我猜它支持,并且 Mac 正在使用它们来存储额外的元数据(并且服务器可能将它们存储为 ZFS 扩展属性)。您可以直接在服务器上查找它们,或者您也可以尝试从 Windows 客户端安装卷,看看是否可以看到它们。

答案2

我得到了 1984 年 1 月 24 日凌晨 3 点 00 分,这是复活节彩蛋(第一台 Mac 出售的那天):在传输过程中的时间戳直到传输完成(复制结束时出现了一些小故障,没有自动修复该日期)

假设灰色文件夹位于特定文件夹内的顶层(否则,向 gci 命令添加“-recurse”并从 find 命令中删除“-maxdepth 1”):

不是 ADS(在 WinOS 机器 powershell 上):

    gci -path 'd:\specificfolder' | % {$_.fullname} | gi -stream *

不是 AppleDouble(连接到好的特定文件夹,然后连接到坏的特定文件夹(即坏的文件夹将附加“-1”),然后在终端中):

    rm /Volumes/specificfolder-1/._*  && rm /Volumes/specificfolder-1/.DS_Store

Windows 可以正常处理损坏的文件夹(并且可以正确查看日期),并且您说得对,Mac 的底层 unix(或 linux)可以使用命令查看正确的日期ls -la,而所有 MacOS 都会看到灰色症状,因此它与您用来复制问题类型的机器无关(并且在 Windows 中复制文件会产生灰色的副本,因此 WinOS 肯定知道如何传输隐藏的信息!)。

所以我只能帮助查明问题所在,并同意你的解决方案(但请注意,右键单击并获取信息或选择和 command+i 在 High Sierra 中并没有消失,截至本文撰写时的当前操作系统);但是,如果你有一堆文件夹变灰:最好自动化;因此,要添加一些东西,你可以运行以下两个命令:

    find /Volumes/specificfolder/ -maxdepth 1 -type d -exec getfileinfo {} \; \
    | egrep "directory|created" | sed -e 's/directory: "\(.*\)"/\1/' \ 
    | sed -e 's/created: \(.*\)/\1/' \
    | sed -e 's#/Volumes/specificfolder#/Volumes/specificfolder-1#' > temp.txt


    while read oddline; do read evenline; setfile -d "$evenline" "$oddline"; \
    done < temp.txt

相关内容