Quelle est la signification de {} + dans la commande -exec de find?


23

Je veux connaître la signification de {} +dans la execcommande et quelle est la différence entre {} +et {} \;. Pour être exact, quelle est la différence entre ces deux:

find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;

5
Il est décrit en man find(1)détail, facilement accessible à tous. Ne sois pas paresseux.
Miroslav Koškár

Merci cher Miroslav, j'ai cherché man exec!

Ah, je n'avais jamais rencontré l' {} +utilisation auparavant. J'utilise normalement des xargs pour cela (et souvent find ... -print0 | xargs -0 ...)

Réponses:


27

L'utilisation de ;(point-virgule) ou +(signe plus) est obligatoire pour terminer les commandes shell appelées par -exec/ execdir.

La différence entre ;(point-virgule) ou +(signe plus) réside dans la façon dont les arguments sont passés dans le paramètre -exec/ de find -execdir. Par exemple:

  • l'utilisation ;exécutera plusieurs commandes (séparément pour chaque argument),

    Exemple:

    $ find /etc/rc* -exec echo Arg: {} ';'
    Arg: /etc/rc.common
    Arg: /etc/rc.common~previous
    Arg: /etc/rc.local
    Arg: /etc/rc.netboot
    

    Tous les arguments suivants findsont considérés comme des arguments de la commande.

    La chaîne {}est remplacée par le nom de fichier actuel en cours de traitement.

  • using +exécutera le moins de commandes possible (car les arguments sont combinés ensemble). C'est très similaire au fonctionnement de la xargscommande, il utilisera donc autant d'arguments par commande que possible pour éviter de dépasser la limite maximale d'arguments par ligne.

    Exemple:

    $ find /etc/rc* -exec echo Arg: {} '+'
    Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
    

    La ligne de commande est créée en ajoutant à la fin chaque nom de fichier sélectionné.

    Une seule instance de {}est autorisée dans la commande.

Voir également:


Il y a une différence et une différence majeure. Voir la réponse de user1116056
Jahid

24

Étant donné que la commande find obtient en dessous de trois fichiers:

fileA
fileB
fileC

Si vous utilisez -execun signe plus ( +),

find . -type f -exec chmod 775 {} +  

ce sera:

chmod 775 fileA fileB fileC

La ligne de commande est créée en ajoutant à la fin chaque nom de fichier correspondant, de la même manière que pour la xargsconstruction de ses lignes de commande. Le nombre total d'appels de la commande ( chmod, dans ce cas) sera bien inférieur au nombre de fichiers correspondants.

Si vous utilisez -execun point-virgule ( ;),

find . -type f -exec chmod 775 {} \;

ce sera:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC

5

Selon man find:

-exec command {} + Cette variante de l'action -exec exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est créée en ajoutant à la fin chaque nom de fichier sélectionné; le nombre total d'appels de la commande sera bien inférieur au nombre de fichiers correspondants. La ligne de commande est construite de la même manière que xargs construit ses lignes de commande. Une seule instance de '{}' est autorisée dans la commande. La commande est exécutée dans le répertoire de départ.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.