4 votes

Existe-t-il un moyen d'utiliser la commande update pour localiser les fichiers sous OS X sans avoir à exécuter updatedb manuellement ?

J'envisage d'utiliser un alias pour locate, car je trouve vraiment gênant de devoir lancer updatedb si souvent sur mac.

Avez-vous des idées ou des solutions de contournement pour cela ?

0 votes

Pouvez-vous développer davantage ? Avec Yosemite et le Finder, les fichiers et les emplacements sont mis à jour presque instantanément, je n'ai donc aucun cadre de référence pour répondre à votre question.

1 votes

@Allan de man locate -> The database is recomputed periodically (usually weekly or daily), and contains the path- names of all files which are publicly accessible.

5voto

Douglas Points 10417

Si vous voulez que locate se mette à jour plus fréquemment, vous devez modifier l'adresse de l'utilisateur. /System/Library/LaunchDaemons/com.apple.locate.plist fichier.

Plus précisément, vous voulez trouver le <key>StartCalendarInterval</key> et le modifier selon vos spécifications. Par défaut, locate est configuré pour se mettre à jour à 3h15 du matin tous les samedis (le dimanche étant le premier jour qui commence par 0).

<key>StartCalendarInterval</key>
        <dict>
                <key>Hour</key>
                <integer>3</integer>
                <key>Minute</key>
                <integer>15</integer>
                <key>Weekday</key>
                <integer>6</integer>
        </dict>

Cela fonctionne comme cron, vous pouvez donc spécifier un astérisque si vous voulez, par exemple, l'exécuter tous les jours. Il suffit de modifier le champ 6 à et * et il fonctionnera à 15h15 tous les jours.

Une façon plus simple de procéder est d'utiliser l'option d'exécution à un intervalle défini, par exemple toutes les 3 heures. StartInterval <integer> de la directive. Ainsi, pour que votre tâche soit exécutée toutes les trois heures, insérez la directive suivante dans le fichier plist :

<key StartInterval</key>
   <integer>108000</integer>

Le nombre entier est le nombre de secondes. Ainsi, 60 secondes dans une minute, 60 minutes dans une heure et ainsi de suite.

N'oubliez pas d'enlever le StartCalendarInterval directive.

Enfin, et surtout... faites une copie de sauvegarde de votre fichier .plist avant de le modifier. De cette façon, si vous faites des erreurs, vous aurez une bonne configuration sur laquelle vous pourrez vous reposer.

Note : Pour que ces modifications fonctionnent sous OS X El Capitan, vous devez désactiver la protection de l'intégrité du système d'OS X (SIP). Vous pouvez le faire UNIQUEMENT en utilisant csrutil en mode de récupération du système.

Démarrez le Mac en mode de récupération du système en maintenant Command + R .

En utilisant le Terminal, entrez csrutil disable

Vous devriez voir ce qui suit : Successfully disabled System Integrity Protection. Please restart machine for changes to take effect.

Redémarrage.

locate devrait maintenant être mis à jour selon votre calendrier.

Avis de non-responsabilité : Cette procédure n'est pas recommandée. Bien que cette réponse réponde techniquement à la question, elle ne couvre pas la "Pourquoi est-il nécessaire de modifier le calendrier de mise à jour ?" question.

3 votes

Qu'en est-il du SIP en System/Library/LaunchDaemons ?

1 votes

Bien que l'OP n'ait pas précisé la version d'OS X qu'il utilise, Mateusz Szlosek a soulevé un point important. Vous pourriez donc ajouter des informations sur le SIP et sa désactivation.

1 votes

C'est vrai... j'avais oublié la protection de l'intégrité du système. Je vais mettre à jour ma réponse.

2voto

Oskar Points 1242

Locate consulte toujours une base de données qui est soit obsolète, soit mise à jour périodiquement, soit non créée par défaut.

Vous pouvez charger la tâche hebdomadaire pour régénérer ceci avec une commande :

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Sous OS X, il serait préférable d'utiliser mdfind qui utilise la base de données Spotlight et est conçu pour se mettre à jour en permanence et fournir des mises à jour en temps réel de l'index.

Ces derniers mdfind Les requêtes affichent des résultats rapides lorsqu'un autre processus crée un fichier qui correspond à vos critères de recherche - le résultat arrive presque instantanément.

Changer votre alias pour utiliser mdfind au lieu de locate vous permet de contourner les limites de conception de locate et le find qu'il utilise pour parcourir le système de fichiers.

1 votes

D'après mon expérience, mdfind manque toujours certains fichiers cachés et fichiers système, même lorsque vous lui donnez les arguments tortueux pour les inclure dans les résultats.

0 votes

@calum_b Il s'agit probablement d'un problème de permissions plutôt que de la commande elle-même.

0 votes

Pas vraiment ; par défaut, la base de données locate n'est pas créée du tout sur MacOS, et lorsque vous la créez, elle n'est plus jamais mise à jour à moins que vous ne lanciez une commande launchctl. De plus, elle n'est mise à jour qu'une fois par semaine par défaut. apple.stackexchange.com/a/14842/2841

2voto

Pryftan Points 121

Il n'est pas nécessaire de désactiver le protocole SIP pour cela ; vous pouvez plutôt utiliser la fonction /Library pour cela. J'ai eu ce même problème parce que je n'ai pas mon MacBook Pro allumé la nuit et je suis également habitué à d'autres systèmes où il y a un cronjob quotidien qui fait cela. Cependant, il est possible de configurer cette opération à la demande ou même au démarrage de l'ordinateur : et non, vous n'avez pas besoin de désactiver SIP (malgré ce qu'une autre réponse suggère). C'est ainsi que j'ai procédé ; s'il y a quelque chose qui pourrait être amélioré, je suis plus qu'heureux de l'entendre et certainement dans mon état de fatigue je pourrais avoir écrit quelque chose de faux ou même oublié une étape ou un point important. Je corrigerai tout ce qui sera porté à mon attention.

Le fichier standard qui fait cela et qu'Apple installe se trouve à l'adresse suivante /System/Library/LaunchDaemons/com.apple.locate.plist mais vous pouvez installer le vôtre à /Library/LaunchDaemons . Ce que j'ai fait, c'est que j'ai d'abord copié celui d'Apple par défaut dans un répertoire temporaire, que j'ai fait quelques modifications et que je l'ai ensuite déplacé dans le deuxième répertoire : j'ai ensuite mis à jour le système (voir ci-dessous) pour qu'il fonctionne au démarrage (et je crois aussi quand on le charge à ce moment-là). Il semble qu'il y ait une sorte de "standard" pour le nom du fichier, mais j'ai pris le nom de mon système et l'ai utilisé comme partie du nom. Ici, j'utiliserai plutôt mon identifiant :

Exemple de fichier utilisateur : com.pryftan.locate.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.pryftan.locate</string>
<key>RunAtLoad</key>
<true/>
<key>LaunchOnlyOnce</key>
<true/>
<key>ProgramArguments</key>
<array>
    <string>/usr/libexec/locate.updatedb</string>
</array>
<key>LowPriorityIO</key>
<true/>
<key>Nice</key>
<integer>5</integer>
<key>KeepAlive</key>
<dict>
    <key>PathState</key>
    <dict>
        <key>/var/db/locate.database</key>
        <false/>
    </dict>
</dict>
<key>AbandonProcessGroup</key>
<true/>
</dict>
</plist>  

Installer le fichier (où '$' est l'invite de commande) :

$ sudo cp com.pryftan.locate.plist /Library/LaunchDaemons
$ sudo launchctl load -w /Library/LaunchDaemons/com.pryftan.locate.plist

Notes supplémentaires

Observez que le nom du fichier (moins l'élément .plist ) est dans le fichier lui-même ; quel que soit le nom que vous donnez au fichier, il doit également être mis à jour dans le fichier.

Après avoir installé le fichier et l'avoir chargé, le système devrait démarrer immédiatement la /usr/libexec/locate.updatedb commandement. Elle utilise /tmp pour certains fichiers temporaires et, une fois qu'elle a terminé, elle supprime bien sûr ces fichiers. Vous verrez alors si vous regardez le fichier de la base de données qu'il a été mis à jour (ou modifié).

Notez le -w à la commande ci-dessus n'est pas strictement nécessaire : c'est seulement s'il y a une clé 'Disabled' dans le fichier mais comme j'ai vu pour la première fois l'invocation de la commande avec cette option, je l'ai gardée même après avoir supprimé cette clé.

Si vous voulez mettre à jour la base de données manuellement, vous pouvez exécuter la commande directement (ou - d'après un test effectué il y a un moment - vous pouvez recharger en utilisant la même commande launchctl load que ci-dessus) :

$ sudo /usr/libexec/locate.updatedb

Oh et dans un commentaire à une autre réponse, j'ai noté qu'en fait, il montre les répertoires des utilisateurs. En fait, en y réfléchissant, c'est probablement lié aux permissions ; c'est certainement le cas sous Linux. Cela a du sens bien sûr ; ce n'est pas une limitation de la commande mais un mécanisme de sécurité et de confidentialité qui fait partie de l'OS lui-même. Cela signifie que, bien que la base de données dispose de tous les fichiers, l'utilisateur ne peut pas voir les fichiers qu'il n'a pas la permission de voir (répertoires).

Une dernière chose : j'ai eu un problème initial de formatage avec le fichier ci-dessus, donc s'il y a une erreur, faites-le moi savoir et je verrai à la corriger (quand je vérifierai les messages - j'ai beaucoup de choses à faire en ce moment). S'il y a des erreurs, il en va de même. Je sais en tout cas que ce que j'ai fonctionne, donc tant que tout est fait comme expliqué - et tant que j'ai bien expliqué (et collé), cela devrait être ce dont vous avez besoin : si vous voulez avoir une mise à jour à chaque démarrage. Si ce n'est pas le cas, vous pouvez faire ce qu'une autre réponse dit, mais vous pouvez mettre le fichier dans le répertoire que j'ai noté plutôt que de modifier le fichier système lui-même.

0 votes

Existe-t-il un moyen d'exécuter cette opération de manière à ce qu'elle soit réellement synchronisée ? Cela signifie que si je supprime des éléments, ils seront supprimés. De même, si j'ajoute, les choses sont ajoutées à l'index ?

0 votes

@momo Désolé pour le retard. J'ai beaucoup de choses à faire. Est-ce que vous essayez de dire que si, après l'exécution de ce programme, vous supprimez un fichier ou créez un nouveau fichier ou répertoire, il sera alors pris en compte dans la base de données ? Non, ce n'est pas possible directement. Il faudrait constamment interroger le(s) système(s) de fichiers pour détecter les modifications de fichiers et mettre à jour la base de données très souvent. Ce n'est pas ce que vous souhaitez. Ceci étant dit, si vous voulez la mettre à jour manuellement, vous pouvez faire ce que j'ai indiqué dans la réponse : sudo /usr/libexec/locate.updatedb

0 votes

@momo J'ai pensé à offrir un service alternatif qui se mettrait à jour toutes les X heures, ou peu importe la durée. C'est probablement ce qui se rapproche le plus de ce que vous pouvez avoir. Par exemple, vous pourriez le mettre à jour toutes les heures. Est-ce suffisant ?

0voto

Ridcully Points 8353

locate Par défaut, la base de données de la Commission n'est mise à jour qu'une fois par semaine. Pour modifier son calendrier, il faut désactiver SIP, comme nous l'avons déjà expliqué, ce qui signifie désactiver les mécanismes de sécurité mis en place pour votre protection. Ce n'est pas recommandé. Aussi, locate semble ne trouver que les fichiers "publics" - donc, pas les fichiers de votre répertoire personnel.

mdfind ne trouvera plutôt que les choses qu'une recherche Spotlight trouve. Par exemple, il semble manquer des fichiers à l'intérieur de paquets de fichiers. Et il se situe quelque part entre l'inconvénient, l'imprécision et l'inutilité si vous souhaitez uniquement effectuer des recherches sur la base des noms de fichiers.

La dernière option, mais la plus classique, est d'utiliser la fonction find dans le terminal. Il y a beaucoup d'options, donc il vaut mieux vérifier man find . Mais l'utilisation de base, de type localisation, est simple : find <root directory for search> -iname <filename_with_wildcards> . Il sera probablement lent (en fonction de la taille de la partie de l'arbre du système de fichiers dans laquelle vous effectuez la recherche), mais il vous montre l'état actuel du système de fichiers, tel qu'il est vu par l'utilisateur actuel. Donc, lancez-la avec sudo et vous chercherez tous les fichiers du système.

Et si vous voulez trouver sans descendre au niveau du Terminal, vous pouvez essayer le logiciel gratuit EasyFind de Devon Techonologies . Fonctionne bien.

0 votes

Je me rends compte que votre message date de quelques années, mais au moins dans Mojave, locate affiche effectivement les fichiers dans les répertoires personnels. Je suis presque sûr qu'il le fait aussi dans Safari ; c'est une commande que j'utilise dans différents Unices et quand j'ai eu mon MacBook Pro en 2018, je suis certain de l'avoir utilisée et d'avoir vu les fichiers dans les répertoires personnels (que je continue à vouloir taper /home et à devoir faire une pause !) et je l'ai eu en mars de l'année dernière, donc bien avant la mise à jour vers Mojave.

0 votes

Existe-t-il un moyen d'exécuter cette opération de manière à ce qu'elle soit réellement synchronisée ? En d'autres termes, si je supprime des éléments, ils sont supprimés. De même, si j'ajoute, les choses sont ajoutées à l'index. Je ne me préoccupe pas du SIP.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X