Comment déclencher un script après duplication / copie d'un répertoire dans Mac OSX / Finder

StackOverflow https://stackoverflow.com/questions/2028220

  •  19-09-2019
  •  | 
  •  

Question

Dans Snow Leopard, je veux déclencher un script / code à chaque fois qu'un utilisateur copie un répertoire dans le Finder. Comment puis-je faire?

J'ai la chasse autour des documents, mais je suis un peu trop nouveau ce type de travail à reconnaître la bonne approche.

Motivation : Si un répertoire est sous contrôle de version, dire avec git ou hg ou svn, et l'utilisateur copie ce répertoire, je veux exécuter un script qui recherche le répertoire d'origine, puis fait une « étiquette » dans le contrôle de version. Si l'utilisateur renomme le répertoire, par exemple dans les 10 secondes, alors le changement de nom ferait partie de ce commentaire tag. Je finirais voudrais jeter sur quelques icônes de recouvrement pour indiquer l'état de contrôle de version du répertoire, aussi.

Motivation élargie : Le problème que je fais face est que ce logiciel de contrôle de version, comme git, et hg, à mon avis est trop compliquée à savoir parce qu'il est trop déconnecté du système de fichiers et agit comme sorte d'ombre système de fichiers. Je suis un grand fan de contrôle de version et ai utilisé pendant de nombreuses années - mais je l'ai aussi vu les limites de déploiement en raison de sa complexité. La réalité est que beaucoup plus de code serait sous contrôle de version si elle était plus facile à utiliser.

J'étudie la possibilité de créer un système plus facile à utiliser VCS qui ne nécessite pas l'accès terminal. Imaginez ce contrôle de version (pour le code) ressemblerait si Apple devait faire partie du viseur et / ou iLife - simple, mais assez bonne. En réalité, je ne suis évidemment pas de réinventer un VCS, mais j'espère que la construction d'un module / plugin pour quelque chose comme hg, et couplage avec une Réinventer de la façon dont fonctionne VCS pour une interface utilisateur finder centrée sur a - tout pour créer une plus simple, mais assez bon, VCS pour le programmeur plus décontracté

.

Le premier obstacle technique la détection des copies de répertoire et renomme - et donc cette question

.

Nombre de fichiers: Depuis la principale motivation de ce projet est pour le contrôle de la version du code source, je ne dois correspondre au nombre de répertoires correspondant au nombre de projets que vous travaillez. Donc, si vous travaillez sur deux projets distincts, alors, je pense, que je ne dois suivre deux répertoires - la racine de chaque projet. Maintenant, je reconnais pleinement que je, à ce stade, être mal caractérisant la nécessité, alors peut-être que je dois suivre tous les répertoires dans les projets, ou peut-être même tous les fichiers dans ces projets, aussi, laisse ainsi dire, pour l'intérêt de la discussion, qu'un projet a généralement 1000 fichiers qu'il contient. Donc, en gros, peut-être seulement quelques répertoires, ou quelques centaines de répertoires, ou peut-être quelques milliers de fichiers. Il est important, je penser 50.000 fichiers seraient à l'extrémité supérieure du spectre.

  

utilisateur copie le répertoire 'tronc' de l'intérieur finder

     

coffre -> copie de coffre

     

Si l'utilisateur renomme « copie de coffre » à « tronc copie fixe # 255 par couleurs »       le répertoire du coffre (pas la copie) serait étiqueté avec       le commentaire 'fixe # 255 par couleurs'

Références :

  • système de fichiers de programmation de l'événement

    • Soyez informé, lors du démarrage, si quelque chose dans un répertoire enregistré changé - le cas échéant d'un fichier dans un grand changement dir. Il ne vous dira pas, je ne pense pas, ce qui l'a modifié.
  • Queues noyau

    • Vous pouvez vous inscrire pour être informé des choses au niveau des fichiers individuels. Vous êtes options (au moins) les éléments suivants: NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE Cela pourrait peut-être utilisé pour détecter un changement de nom de répertoire (il fonctionnera pour dirs?), Mais apparemment pas une copie dir.

Slightly question connexe :

Merci, JJ

Était-ce utile?

La solution

Le message original a proposé un projet vraiment grand, avec beaucoup de fonctionnalités non spécifiées. Votre « motivation élargie » se terminant par « ... détecter des copies de répertoire et renomme ... » a été utile.

Tout d'abord, vous avez assez bien répondu à votre propre poste avec les références à des événements et des fichiers du noyau du système Queues. Vous aviez raison de rejeter les actions de dossier, mais pour la mauvaise raison. Tu avais l'air préoccupé par l'activation d'un grand AF nombre de dossiers. Ce n'est pas un problème, car il pourrait être automatisé. La raison pour laquelle les autorités fédérales ne fonctionnera pas est qu'ils ne peuvent pas détecter un changement de nom de fichier. En outre, il y a un énorme problème avec les frais généraux et parce que les actions concurrency sont AppleScript.

Et vous aviez raison à propos de FS Events: (de Darwin Docs )

  

Le point important à emporter est-   que la granularité des notifications   est à un niveau de répertoire. Il vous dit   seulement que quelque chose dans le répertoire   a changé, mais ne vous dit pas   ce qui a changé.

Il semble donc vous reste du noyau Queues. Ils font tout. Notez que vous devez être intelligent pour utiliser le noyau Queues- vous devez connaître le nom d'un flie pour le surveiller. Alors que de nouveaux fichiers / dossiers sont créés, vous devrez interpréter les événements, et ouvert (O_EVTONLY) les nouveaux fichiers. Cependant, il y a un problème: (plus Darwin Documents )

  

Si vous surveillez un grand   hiérarchie de contenu, vous devez utiliser   les événements du système de fichiers au lieu, cependant,   parce que les files d'attente du noyau sont un peu   plus complexe que les événements du noyau, et   peut être plus de ressources parce que   de l'utilisateur supplémentaire noyau   communication en cause.

Une autre réponse a mentionné que TimeMachine utilisé Événements FS. Je doute qu'en raison de la note « granularité grossière ». Je pense qu'il ya un crochet spécial dans le code « fermer le fichier » du noyau. Au moins, c'est-ce qu'il vous semble nécessaire si vous voulez surveiller de nombreux fichiers. Combien envisagez-vous?

Autres conseils

Il semble que les événements du système de fichiers est ce que vous voulez. Peut-être vous évitent désormais parce qu'il semble compliqué, mais je pense que ce que vous essayez de faire est compliquée en général.

événements du système de fichiers Spotlight et l'utilisation de Time Machine afin de déterminer ce qui a changé dans le système de fichiers et donc quels fichiers doivent être indexés ou sauvegardés. Votre exigence est similaire, mais au lieu de sauvegarder, vous voulez vérifier si les répertoires mis à jour existent dans le contrôle de la source, et sinon, déterminer si quelque chose (soit les nouveaux répertoires ou une étiquette ou autre) devraient être ajoutés au contrôle de code source.

Il y a probablement une façon de le faire juste dans le Finder, mais vous voulez probablement savoir si un utilisateur copie un répertoire à partir de la ligne de commande ou d'un autre programme.

Pourriez-vous aller dans un peu plus de détails sur votre motivation pour cette fonction? On dirait que vous essayez de permettre aux utilisateurs de contrôler la source « utiliser » sans avoir à apprendre. « Il suffit de copier le répertoire et le code d'intégration prendra soin de tout. » Mais je pense que vous allez rencontrer des problèmes en essayant de faire interpréter les changements du système de fichiers très généraux comme les commandes de contrôle de source implicite.

Si vous voulez simplement déclencher ce script sur certains dossiers, vous devez utiliser ce que Apple appelle « Action dossier », vous pouvez joindre à quel dossier comme un script de pomme.

Je ne sais pas ce que l'exacte même le Finder déclenchera mais si je devais mon mac avec moi sais que je voudrais ouvrir Automater et regarder sous « Fichiers et dossiers » Je suis 100%, vous trouverez un événement pour la duplication ou la copie il.

il n'y a pas « le double » et « sur renommage » les événements du Finder / système dans les scripts Automator, donc exactement ce que vous demandez nécessite l'utilisation des événements du système de fichiers (que je ne vais pas entrer pour), mais la AppleScript suivant rapide

  • les prises tous les éléments ajouté dans le dossier (y compris ceux ajoutés par duplication)
  • demande à l'utilisateur de fournir un nom de balise
  • exécute un script bash avec cette info

qui devrait vous permettre de construire une bonne solution

  1. lieu additem.scpt dans / Library / Scripts / Scripts d'action du dossier
  2. fixup.sh dans le dossier contenant le tronc (ou d'ajuster et de mettre où vous voulez)
  3. sur le dossier contenant, faites un clic droit et sélectionnez "Action Setup du dossier ..."
  4. connecter le dossier avec le nouveau script
  5. modifier fixup.sh pour répondre à vos besoins

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top