Скажіть, чи папка / файл приховано в Mac OS X


10

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

Але чи все-таки можна сказати, папка / файл наразі прихована чи ні?

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

Відповіді:


10

Відповідно до сторінки ls man , ви повинні мати можливість -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залежить від того, чи є справа файлом чи папкою, оскільки папки показують загальну кількість, тоді як файли - ні. Щоб обійти це, ми можемо поздоровитись за персонажем 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: Дивіться відповідь Тиїло нижче про кращий спосіб, ніж привітання до r:)


Але, роблячи це за допомогою папки, перелічить прапори для файлів / папок під нею
Тиїло,

Щоб просто переглянути приховані файли, передайте їх через 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 }'щоб він відображав інформацію.


1
Майте на увазі, що awk зламається, якщо в імені користувача або групи буде пробіл (що має бути вкрай малоймовірним, але ей). Я додав більш безпечне рішення, яке використовує stat.
мрм

1

Як посилається на @Tyilo , @Sorpigal пропонує спробувати stat, який кодує "прапори користувачів" %Xf(він X закодований користувач f lag), і набагато безпечніший для машинного розбору.

$ 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 */
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.