Que signifie "{} \;" dans une commande Linux?

26

Parfois, je vois la commande suivante:

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

On m'a demandé de l'exécuter.

Que signifie {} \; ici?

    
posée codeofnode 29.08.2013 - 20:27
la source

2 réponses

39

Si vous exécutez find avec exec , {} se développe en un nom de fichier pour chaque fichier ou répertoire trouvé avec find (de sorte que ls dans votre exemple récupère tous les noms de fichiers trouvés - notez que il appelle ls ou toute autre commande que vous spécifiez une fois pour chaque fichier trouvé.

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

Consultez cet article pour plus de détails.

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

La différence de comportement (si ce n’est en termes d’efficacité) 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 assez courts ), le résultat est une ligne par fichier dans le premier cas et le comportement standard de ls d’afficher les fichiers en colonnes pour ce dernier.

    
réponse donnée moon.musick 29.08.2013 - 20:39
la source
17

À partir de la page de manuel relative à la commande 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 ';' 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 find ". Comme dans "quel que soit find trouvé". find renvoie le chemin du fichier que vous recherchez, non? Donc {} le remplace; c'est un espace réservé pour chaque fichier que la commande find localise (extrait de ici ).

La partie \; indique en gros find "ok, j'ai fini avec la commande que je voulais exécuter".

Exemple:

Disons que je suis dans un répertoire contenant tous les fichiers .txt . Je cours alors:

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

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

    
réponse donnée Alaa Ali 29.08.2013 - 20:41
la source

Lire d'autres questions sur les étiquettes