判断 Mac OS X 中的文件夹/文件是否隐藏

判断 Mac OS X 中的文件夹/文件是否隐藏

chflags hidden foo.txt我知道您可以通过执行和来设置或取消设置文件夹/文件的隐藏标志chflags nohidden foo.txt

但是有没有办法告诉您该文件夹/文件当前是否处于隐藏状态?

我不想只确定文件夹/文件是否以点开头。

答案1

根据ls 手册页,您应该能够将-O选项与-l使用 ls 查看标志的选项结合起来。例如:

ls -Ol foo.txt
-rw-r--r-- 1 harry staff - 0 18 Aug 19:11 foo.txt
chflags hidden foo.txt
ls -Ol foo.txt
-rw-r--r-- 1 harry staff hidden 0 18 Aug 19:11 foo.txt
chflags nohidden foo.txt
ls -Ol foo.txt
-rw-r--r-- 1 harry staff - 0 18 Aug 19:11 foo.txt

编辑:只是为了给出OP想要的更具体的解决方案(参见下面的评论):要查看文件夹是否隐藏,我们可以将选项传递-a给 ls 以查看文件夹本身。然后我们可以将输出通过管道传输到sed -n 2p(谢谢堆栈溢出)以获得该输出所需的行。一个例子:

mkdir foo
chflags hidden foo
ls -aOl foo | sed -n 2p
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .

编辑2:对于一个无论是文件还是文件夹都应该有效的命令,我们需要做一些稍微更hacky的事情。

所需的输出行ls -al取决于该事物是文件还是文件夹,因为文件夹显示总计数,而文件则不显示总计数。为了解决这个问题,我们可以 grep 查找字符r。这应该位于所有文件/文件夹的〜所有文件/文件夹中(几乎所有文件/文件夹都应至少具有一个读取权限),但不在总计行中。

当我们想要获取的行成为第一行时,我们可以使用head -n 1来获取第一行(或者,如果您喜欢 sed,sed -n 1p可以使用)。

因此,以目录为例:

mkdir foo
chflags hidden foo
ls -aOl foo | grep r | head -n 1
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .

并带有一个文件:

touch foo.txt
chflags hidden foo.txt
ls -aOl foo.txt | grep r | head -n 1
-rw-r--r-- 1 harry staff hidden 0 18 Aug 19:11 foo.txt

编辑 3:请参阅下面 Tyilo 的答案,了解比 grep 更好的方法r:)

答案2

在这里找到了解决方案:如何使 ls 仅显示有关指定目录的信息,而不显示有关其子文件或文件夹内容的信息?

基本上就是这样ls -ldO foo,然后您只需附加| awk '{ print $5 }'即可使其显示信息。

答案3

正如所引用的@Tyilo,@索皮加尔建议尝试stat,它将“用户标志”编码为%Xf(heX编码用户Flag),并且对于机器解析来说更安全。

$ stat -f "%Xf" ~/Library
8000

用户标志的十六进制值位于此处:grep UF /usr/include/sys/stat.h。从 macOS 10.11 开始:

#define UF_SETTABLE     0x0000ffff  /* mask of owner changeable flags */
#define UF_NODUMP       0x00000001  /* do not dump file */
#define UF_IMMUTABLE    0x00000002  /* file may not be changed */
#define UF_APPEND       0x00000004  /* writes to file may only append */
#define UF_OPAQUE       0x00000008  /* directory is opaque wrt. union */
/* #define UF_NOUNLINK  0x00000010 */   /* file may not be removed or renamed */
#define UF_COMPRESSED   0x00000020  /* file is hfs-compressed */
/* UF_TRACKED is used for dealing with document IDs.  We no longer issue
   notifications for deletes or renames for files which have UF_TRACKED set. */
#define UF_TRACKED      0x00000040
#define UF_HIDDEN       0x00008000  /* hint that this item should not be */

相关内容