Как запустить скрипт после дублирования / копирования каталога в Mac OSX / Finder - PullRequest
4 голосов
/ 08 января 2010

В Snow Leopard я хочу запускать скрипт / код всякий раз, когда пользователь дублирует каталог в Finder. Как я могу это сделать?

Я охотился за документами, но я слишком новичок в этом виде работ, чтобы признать правильный подход.

Мотивация : Если каталог находится под контролем версий, скажем, с помощью git или hg или svn, и пользователь дублирует этот каталог, то я хочу запустить скрипт, который ищет исходный каталог и затем делает «тег» в управлении версиями. Если пользователь переименует каталог, скажем, в течение 10 секунд, то переименование будет частью комментария этого тега. В конечном итоге мне бы хотелось добавить несколько наложенных значков, чтобы указать состояние управления версиями каталога.

Расширенная мотивация : Проблема, с которой я сталкиваюсь, заключается в том, что программное обеспечение для контроля версий, такое как git и hg, на мой взгляд, слишком сложно, а именно потому, что оно слишком отключено от файловой системы и действует как теневой файловой системы. Я большой поклонник контроля версий и использую его много лет, но я также видел ограничения по развертыванию из-за его сложности. Реальность такова, что намного больше кода было бы под контролем версий, если бы его было проще использовать.

Я изучаю возможность создания более простой в использовании системы VCS, которая не требует терминального доступа. Представьте себе, как будет выглядеть управление версиями (для кода), если Apple сделает его частью Finder и / или iLife - просто, но достаточно хорошо. В действительности я, очевидно, не собираюсь заново изобретать vcs, но я надеюсь, что построение модуля / плагина для чего-то вроде hg, и связывание этого с переосмыслением того, как vcs работает для ориентированного на поиск интерфейса пользователя a - все, чтобы создать более простую, но достаточно хорошую VCS для более простого программиста.

Первое техническое препятствие для обнаружения копий и переименований каталогов - и, следовательно, этот вопрос.

Количество файлов: Поскольку основная мотивация этого проекта - контроль версий исходного кода, мне нужно только сопоставить количество каталогов, соответствующее количеству проектов, над которыми вы работаете. Итак, если вы работаете над двумя разными проектами, то, я думаю, мне нужно отслеживать только два каталога - корень каждого проекта. Теперь я полностью признаю, что в данный момент я могу ошибочно охарактеризовать необходимость, поэтому, возможно, мне нужно отслеживать все каталоги в проектах, или, может быть, даже все файлы в этих проектах, так что, скажем, для ради аргумента, что типичный проект содержит 1000 файлов. Итак, в основном, может быть, только несколько каталогов, или несколько сотен каталогов, или, может быть, несколько тысяч файлов. Важно отметить, что я думаю, что 50000 файлов будут на верхнем конце спектра.

Пользователь дублирует «ствол» dir изнутри искателя

багажник -> копия багажника

Если пользователь переименовывает «копию ствола» в «исправлена ​​копия ствола # 255 для каждого цвета» директория транка (не копия) будет помечена комментарий «фиксированный # 255 для цветов»

Ссылки

  • Программирование событий файловой системы

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

    • Вы можете зарегистрироваться, чтобы получать уведомления о вещах на уровне отдельных файлов. Вы варианты (по крайней мере) следующие: NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE Это может быть использовано для обнаружения переименования директории (будет ли оно работать для директорий?), Но, очевидно, не для директории dir.

Слегка связанный вопрос :

Спасибо, JJ

Ответы [ 4 ]

2 голосов
/ 19 января 2010

В оригинальном сообщении предлагался действительно большой проект с множеством неуказанных функций. Ваша «расширенная мотивация», заканчивающаяся «... обнаружением копий каталога и переименованием ...», была полезна.

Во-первых, вы в значительной степени ответили на свой пост со ссылками на события файловой системы и очереди ядра. Вы были правы отклонить действия с папками, но не по той причине. Вы, кажется, обеспокоены активацией FA для большого количества папок. Это не проблема, потому что это может быть автоматизировано. Причина, по которой FA не будут работать, заключается в том, что они не могут обнаружить переименование файла. Кроме того, существует огромная проблема с издержками и параллелизмом, потому что действия выполняются AppleScript.

И вы были правы насчет событий FS: (из Документы Дарвина )

Важный момент, который нужно забрать, что гранулярность уведомлений находится на уровне каталога. Это говорит вам только то что в каталоге изменилось, но не говорит вам что изменилось.

Так что, похоже, вы остались с очередями ядра. Они делают все. Обратите внимание, что вам нужно быть умным, чтобы использовать Kernel Queues - вы должны знать имя мухи, чтобы следить за ним. Поэтому, когда создаются новые файлы / папки, вам нужно будет интерпретировать события и открывать (O_EVTONLY) новые файлы. Однако существует проблема: (подробнее Документы Дарвина )

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

В другом ответе упоминалось, что TimeMachine использовал FS Events. Я сомневаюсь, что из-за отмеченной «грубой гранулярности». Я подозреваю, что в коде ядра 'close file' есть специальный хук. По крайней мере, это то, что вам нужно, если вы хотите отслеживать много файлов. Сколько вы рассматриваете?

2 голосов
/ 16 января 2010

Звучит так, будто вам нужны события файловой системы.Может быть, вы уклоняетесь от этого, потому что это кажется сложным, но я думаю, что то, что вы пытаетесь сделать, вообще сложно.

Spotlight и Time Machine используют события файловой системы, чтобы определить, что изменилось вфайловая система и, следовательно, какие файлы необходимо проиндексировать или создать резервную копию.Ваше требование аналогично, только вместо того, чтобы выполнять резервное копирование, вы хотите проверить, существуют ли обновленные каталоги в системе контроля версий, и, если нет, определить, нужно ли что-либо (либо новые каталоги, либо тег или что-то еще) добавить в систему контроля версий.

Вероятно, есть способ сделать это только в Finder, но вы, вероятно, также хотите знать, копирует ли пользователь каталог из командной строки или из какой-либо другой программы.

Не могли бы вы войти внемного подробнее о вашей мотивации для этой функции?Похоже, вы пытаетесь разрешить пользователям «использовать» управление исходным кодом без необходимости его изучения.«Просто скопируйте каталог, и код интеграции позаботится обо всем».Но я думаю, что вы столкнетесь с проблемами, пытаясь интерпретировать очень общие изменения файловой системы как неявные команды управления исходным кодом.

1 голос
/ 16 января 2010

в сценариях automator нет событий «на дубликате» и «на переименовании» из искателя / системы, так что именно то, что вы запрашиваете, требует использования событий файловой системы (к которым я не собираюсь обращаться), но следующий быстрый яблочный скрипт

  • ловит все элементы , добавленные в папку (в том числе добавленные дублированием)
  • просит пользователя указать имя тега
  • запускает скрипт bash с этой информацией

, что должно позволить вам построить хорошее решение

  1. место additem.scpt в / Library / Scripts / Папка Action Scripts
  2. fixup.sh в папке, содержащей ствол (или настройте и положите куда хотите)
  3. в содержащей папке, щелкните правой кнопкой мыши и выберите «Настройка действия папки ...»
  4. подключите папку с новым скриптом
  5. отредактируйте fixup.sh в соответствии с вашими потребностями

additem.scpt

on adding folder items to this_folder after receiving added_items
        try
                tell application "Finder"
                        set the folder_name to the name of this_folder
                end tell

                set the item_count to the number of items in the added_items

                repeat with an_added_item in added_items
                        tell application "Finder"
                                set item_name to name of an_added_item
                        end tell

                        set new_name to text returned of (display dialog "Please enter tag name " default answer item_name buttons {"Continue…"} default button 1)

                        set the scriptcode to "\"" & POSIX path of this_folder & "fixup.sh\" \"" & POSIX path of an_added_item & "\" \"" & new_name & "\""
                        display dialog scriptcode
                        do shell script scriptcode
                end repeat
        end try
end adding folder items to

fixup.sh

#!/bin/bash

if [ -d "$1" ]
then
  echo asked to fixup \"$1\" >> /tmp/fixup.log
fi
1 голос
/ 13 января 2010

Если все, что вам нужно, это запускать этот скрипт в некоторых папках, то вам следует использовать то, что Apple называет «Папка-действие», которую вы можете прикрепить к любой папке, в которой вам нравится сценарий яблока.

Я не знаю, что именно сработает даже Finder, но если бы у меня был свой mac со мной, я бы открыл автомат и посмотрел в разделе «Файлы и папки». Я на 100% обнаружил событие для дублирования или копирования есть.

...