Как изменить внешний вид пустых папок в Finder с помощью Automator?

Как изменить внешний вид пустых папок в Finder с помощью Automator?

Я пытаюсь использовать Apple Automator для маркировки пустых папок в иерархии. По сути, я начинаю проект с иерархии пустых папок и заполняю их по мере работы. Я хочу, чтобы рабочий процесс маркировал все пустые папки (серые), которые не содержат файлов, и их потомки также не содержат файлов.

Другими словами, когда я создаю пустой проект, все папки должны быть серыми, так как нигде нет "файлов", только пустые папки. Однако, как только я помещаю файл куда-то, его родитель и все его прародители больше не будут помечены серым.

Я думал, что нашел то, что мне нужно, наКак изменить внешний вид пустых папок в Finder?Однако он помечает пустые папки. В моем проекте только последние потомки будут серыми, потому что все родительские папки содержат папки, следовательно, не пустые.

Вот код, который я запускаю в скрипте оболочки /bin/bash в Automator:

find "$@" -type d -empty

А затем я передаю его в «Элементы поиска меток», чтобы сделать результаты серыми.

Вот результат, который я получаю при запуске в тестовой папке:

  • Тестовая папка (не серая)
    • Папка первая (серая)
    • Папка Два (не серая)
      • Папка А (серая)
    • Папка три (не серая)
      • Тест.txt
    • Папка Четыре (не серая)
      • Папка А (не серая)
        • Тест.txt

И вот какой результат я ищу:

  • Тестовая папка (не серая)
    • Папка первая (серая)
    • Папка Два (серая)
      • Папка А (серая)
    • Папка три (не серая)
      • Тест.txt
    • Папка Четыре (не серая)
      • Папка А (не серая)
        • Тест.txt

Любая помощь будет оценена!

О, и еще, я думаю, что могу запустить рабочий процесс из Hazel. Если у вас есть лучший способ, чтобы он запускался автоматически время от времени, я бы тоже хотел это узнать.

Спасибо.

Редактировать: Только что понял, что файлы .ds_store (я предполагаю) приводят к тому, что папки также не выглядят пустыми, если, например, я удаляю последний файл в папке.

решение1

Я попробовал несколько вариантов, и, похоже, все работает так, как вам нужно:

Скрипт оболочки usr/bin/perl, передайте входные данные as arguments.

автоматизатор сервис

use File::Find;

find({ wanted => \&find_files, no_chdir => 1 }, @ARGV);

sub find_files
{
    if (-f $_)
    {
        ($file) = $_ =~ /.*\/(.*)$/;
        push (@all_files, $_) if ($file ne ".DS_Store");
    }
    else
    {
        push (@all_folders, $_);
    }
}

sub osascript($) { system 'osascript', map { ('-e', $_) } split(/\r/, $_[0]); } 

foreach(@all_files)
{
    @paths = split(/\//, $_);
    for $i (0..$#paths-1)
    {
        if ($i == 0)
        {
            $x = "$paths[$i]";
        }
        else
        {
            $x = "$last[$i-1]/$paths[$i]";
        }
        push(@last, $x);
        $temp{$x} ++;
    }
    @last = ();
 }

@not_gray_folders = keys %temp;
foreach(@all_folders)
{
    $folder = $_; $flag = 0;
    foreach(@not_gray_folders)
    {
        if ($folder eq $_)
        {
            $flag = 1;
        }
    }
    if (!$flag)
    {
        $label = 7;
    }
    else
    {
        $label = 0;
    }
    &osascript ("tell application \"Finder\" to set label index of alias POSIX file \"$folder\" to $label");
}

Связанный контент