Скажите, если папка / файл скрыт в Mac OS X

10

Я знаю, что вы можете установить или снять скрытый флаг папки / файла, выполнив chflags hidden foo.txtи chflags nohidden foo.txt.

Но в любом случае можно сказать, является ли папка / файл в данный момент скрытым или нет?

Я не хочу просто определить, начинается ли папка / файл с точки.

Tyilo
источник

Ответы:

10

В соответствии с man-страницей 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

Редактировать: просто, чтобы дать более конкретное решение для того, что хотел ОП (см. Комментарии ниже): чтобы увидеть, является ли папка скрытой или нет, мы можем передать -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: Для команды, которая должна работать независимо от того, файл это или папка, нам нужно сделать что-то более хакерское.

Необходимая строка вывода 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 ниже для лучшего способа, чем поискать r:)

hrickards
источник
Но сделав это с папкой, перечислю флаги для файлов / папок под ней
Tyilo
Чтобы просто просмотреть скрытые файлы, направьте его через grep (например ls -Ol fooDir/ | grep hidden) для просмотра только скрытых файлов / папок. Это все равно покажет все файлы, но если вы передадите его через магию sed / awk (здесь, боюсь, кому-то еще понадобится помощь), вы сможете получить только список файлов.
Я не хочу, чтобы список файлов, которые я просто хочу знать, является ли папка "foo" скрытой или нет
Tyilo
ОК. Поэтому для просмотра самого каталога добавьте -aопцию в ls. Чтобы просто получить нужную строку из вывода, вы можете использовать sed. Например: ls -aOl foo | sed -n 2p. Это отобразит одну строку вывода. Если оно содержит слово «скрытый», то foo скрыто. Если это не так, foo не скрывается. :)
2
Использование ls -Old dirname/покажет вам свойства самого каталога, а не его содержимое.
Багамат
7

Нашел решение здесь: Как я могу заставить ls показывать информацию только об указанном каталоге, а не информацию о его подфайлах или содержимом папки?

Который в основном есть, ls -ldO fooи тогда вы просто добавляете, | awk '{ print $5 }'чтобы он отображал информацию.

Tyilo
источник
1
Имейте в виду, что awk прервется, если в имени пользователя или имени группы есть пробелы (что должно быть крайне маловероятно, но эй). Я добавил более безопасное решение, которое использует stat.
MRM
1

Как указано на @Tyilo , @Sorpigal предлагает пытаться stat, который кодирует «флаги пользователя» с %Xf(он X закодированы пользователя ф лаг), и гораздо безопаснее для машинного анализа.

$ 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 */
мили относительного движения
источник