Question find -exec devrait se terminer par \; ou +?


Selon le man find -exec option doit se terminer par ;.

L'expression doit être terminée par un point-virgule («;»).

Mais quand j'utilise find-grep dans Emacs, l'expression se termine par +. Lequel dois-je utiliser? Y a-t-il différence deux expression?


4
2017-09-11 11:25


origine




Réponses:


Ceci est du manuel pour GNU find:

   -exec command ;
          Execute command; true if 0 status is returned.
          All following arguments to find are  taken  to
          be  arguments to the command until an argument
          consisting of `;'

Coupé par moi Mais nous avons aussi:

   -exec command {} +
          This variant of  the  -exec  action  runs  the
          specified  command  on the selected files, but
          the command line is built  by  appending  each
          selected  file name at the end; the total num‐
          ber of invocations of the command will be much
          less  than  the  number of matched files.  The
          command line is built in  much  the  same  way
          that xargs builds its command lines.

Coupé par moi

Alors, ; et + faire des choses différentes Un court exemple de code pour démontrer:

$ mkdir test
$ touch test/{a,b}
$ find test -exec echo foo {} \;
foo test
foo test/a
foo test/b
$ find test -exec echo foo {} +
foo test test/a test/b

+ ne génère qu'un seul appel avec tous les fichiers correspondants donnés sous forme de liste d'arguments (en pratique, il se comporte comme xargs). ; exécute la commande une fois pour chaque fichier correspondant (le ; doit être échappé dans la coquille; d'où le précédent \).

Notez que certaines versions de find manque le + option, mais la version GNU est très probablement installée sur n'importe quel système Linux non intégré.


6
2017-09-11 11:36



Notez aussi le -execdir option. Il agit comme -exec, mais il crée une commande distincte pour le dossier séparé. Il est utilisé lorsque la commande appelante peut être confondue en démarrant dans le mauvais dossier. Vous pouvez utiliser ; ou + (avec la même signification que pour -exec-) avec -execdir. - Paddy Landau
@DanielAndersson + ne génère pas toujours une seule invocation. Il génère moins d’invocations que ;. - nekketsuuu


TL; DR:

Utiliser le + in -exec est le même que -exec, sauf cette {} est remplacé par autant de noms de chemins que possible pour chaque appel d'utilitaire.


Un peu plus long de man find sur mon ordinateur:

   utilitaire -exec [argument ...];
             True si l'utilitaire nommé du programme renvoie une valeur nulle
             comme son statut de sortie. Des arguments facultatifs peuvent être transmis
             à l'utilitaire.
             L'expression doit être terminée par un point-virgule. Si vous
             invoquer trouver à partir d'un shell, vous devrez peut-être citer le
             point-virgule si le shell le traiterait autrement comme un contrôle
             opérateur. Si la chaîne "{}" apparaît n'importe où dans le
             nom d'utilitaire ou les arguments, il est remplacé par le chemin
             du fichier en cours.
             Utilitaire sera exécuté à partir du répertoire à partir duquel trouver était
             réalisé. L'utilité et les arguments ne sont pas soumis à la
             expansion des modèles de coque et des constructions.


     utilitaire -exec [argument ...] {} +
             Identique à -exec, sauf que `{}` est remplacé par autant
             chemins d'accès possibles à chaque invocation d'utilitaire.
             Ce comportement est similaire à celui de xargs (1).

Notez le deuxième paragraphe. Ne pas arrêter de lire après le premier paragraphe expliquant -exec.


4
2017-09-11 11:31