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 */