web-dev-qa-db-fra.com

Qu'est-ce que "{} \;" signifie dans une commande Linux?

Parfois, je vois la commande suivante:

find . -name  * -exec ls -a {} \;

On m'a demandé d'exécuter ceci.

Que signifie {} \; ici?

36
codeofnode

Si vous exécutez find avec exec, {} se développe en tant que nom de fichier de chaque fichier ou répertoire trouvé avec find (afin que ls dans votre exemple obtienne chaque argument trouvé - notez qu'il appelle ls ou toute autre commande que vous spécifiez une fois pour chaque fichier. a trouvé).

Le point-virgule ; termine la commande exécutée par exec. Il doit être échappé avec \ pour que le shell dans lequel vous exécutez find ne le traite pas comme son propre caractère spécial, mais le transmette plutôt à find.

Voir cet article pour plus de détails.


De plus, find fournit une optimisation avec exec cmd {} + - lorsqu'il est exécuté de la sorte, find ajoute les fichiers trouvés à la fin de la commande plutôt que de l'invoquer une fois par fichier (afin que la commande ne soit exécutée qu'une seule fois, si possible).

La différence de comportement (si ce n’est pas efficace) est facilement perceptible si elle est exécutée avec ls, par exemple.

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +

En supposant que vous ayez des fichiers jpg (avec des chemins d'accès suffisamment courts ), le résultat est une ligne par fichier dans le premier cas et le comportement standard ls d'affichage des fichiers en colonnes pour le dernier.

46
moon.musick

Depuis la page de manuel pour la commande findname__ Manpage icon :

-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 `;' is encountered.  The string `{}' is replaced  by  the  current
              file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
              is alone, as in some versions of find.  Both of these constructions might need to be escaped (with a  `\')  or
              quoted  to  protect them from expansion by the Shell.

Alors voici l'explication:

{} signifie "la sortie de findname__". Comme dans "quel que soit findtrouvé". findrenvoie le chemin du fichier que vous recherchez, non? Donc {} le remplace; c'est un espace réservé pour chaque fichier que la commande findlocalise (tiré de here ).

La partie \; indique en gros find"bon, c’est fini avec la commande que je voulais exécuter".

Exemple:

Disons que je suis dans un répertoire plein de fichiers .txt. Je cours ensuite:

find . -name  '*.txt' -exec cat {} \;

La première partie, find . -name *.txt, renvoie la liste des fichiers .txt. La seconde partie, -exec cat {} \; exécutera la commande catpour chaque fichier trouvé par findname__, donc cat file1.txt, cat file2.txt, etc.

20
Alaa Ali