Знание ls о «скрытом» флаге файла

12

Можно ли lsузнать hiddenфлаг файла в Mac OS X?

В настоящее время простое ls -lOпроизводит:

$ ls -lO
total 0
drwxr-xr-x@  84 danielbeck  staff  -      2856 29 Mai 22:44 Applications
drwx------+ 158 danielbeck  staff  -      5372 29 Mai 15:27 Desktop
drwx------@ 250 danielbeck  staff  -      8500 30 Mai 20:40 Documents
drwx------+  11 danielbeck  staff  -       374 29 Mai 22:21 Downloads
drwx------@  84 danielbeck  staff  -      2856 29 Mai 22:48 Library
drwx------@   3 danielbeck  staff  hidden  102  3 Apr 20:45 Movies
drwx------@   5 danielbeck  staff  hidden  170  3 Apr 20:45 Music
drwx------+ 215 danielbeck  staff  -      7310 29 Mai 22:54 Pictures
drwxr-x---@   7 danielbeck  staff  hidden  238  3 Apr 20:45 Public
drwxr-xr-x@   4 danielbeck  staff  hidden  136 24 Apr 23:25 Sites

Таким образом, у нас есть три вида видимости: обычные, видимые файлы, файлы с hiddenфлагом файла, которые на самом деле не скрыты в Терминале, и действительно скрытые файлы, имена которых начинаются с точки.

Есть ли способ, например с помощью псевдонима или надежной функции оболочки, чтобы lsлечить hiddenпомечено и .dothiddenфайлов одинаковы, то есть шкурка по умолчанию и шоу с ls -Aили ls -a, подобно тому , как Finder ведет себя в зависимости от значения defaults read com.apple.Finder AppleShowAllFiles?

Я в курсе, что man chflagsконкретно упоминается hiddenфлаг, который скрывается только от GUI, то есть от Finder.

Даниэль Бек
источник

Ответы:

8

Это шаги, чтобы получить OS X, lsкоторая скрывает файлы со скрытым флагом, если -a/-Aне указана опция, аналогично точечным файлам.

  1. Установите Xcode. Я использую Xcode 4.5.1 ниже.
  2. Загрузите вашу версию ОС libutilи file_cmdsс http://www.opensource.apple.com . С правой стороны каждой записи списка пакетов есть кнопка загрузки. Это руководство было написано для OS X 10.8.2, YMMV с точными шагами ниже, если вы используете другую версию.
  3. Распакуйте оба архива.
  4. Откройте file_cmds.xcodeprojв Xcode и выберите, чтобы построить lsцель.

    Скриншот

  5. Выберите file_cmdsпроект XCode слева и выберите lsцель в главной области. На вкладке « Настройки сборки » найдите « Пути поиска по заголовкам» в категории « Заголовки » и добавьте путь к папке, в которую вы извлекли libutil.

    Скриншот

  6. Откройте файл print.cв lsпапке слева и удалите строку с надписью #include <membershipPriv.h>. Сохраните файл позже. Это должно что-то сломать, потому что включения есть по причине, но я еще не определил, что это такое.

  7. Откройте файл ls.cв той же папке и найдите комментарий /* Only display dot file if -a/-A set. */в displayфункции. Замените его и приведенное ниже условие следующим текстом:

    /* Only display dot file and file with hidden flag if -a/-A set. */
    sp = cur->fts_statp;
    if (((sp != NULL && (sp->st_flags & 0x8000)) || cur->fts_name[0] == '.') && !f_listdot) {
        cur->fts_number = NO_PRINT;
        continue;
    }
    
  8. Нажмите Cmd- Bчтобы построить.

    Успех!

  9. Выберите Товары слева (конец списка папок) и щелкните правой кнопкой мыши ls. Выберите Показать в Finder .

    Скриншот папки «Создать выходной файл»

  10. Переместите lsисполняемый файл куда угодно, например, в свой домашний каталог. Затем откройте Terminal и запустите sudo mv $HOME/ls /bin/ls, или, что еще лучше, создайте новую папку с именем binв вашем домашнем каталоге и переместите ее туда. Добавьте эту папку к себе PATHпотом.

Тестирование результата:

$ mkdir test
$ cd test
$ touch foo bar
$ chflags hidden bar
$ /bin/ls -lO
total 0
-rw-r--r--@ 1 danielbeck  staff  hidden 0 25 Okt 22:25 bar
-rw-r--r--  1 danielbeck  staff  -      0 25 Okt 22:25 foo
$ $HOME/bin/ls -lO
total 0
-rw-r--r--  1 danielbeck  staff  - 0 25 Okt 22:25 foo
$ $HOME/bin/ls -A
bar foo
Даниэль Бек
источник