Parfois, je vois la commande suivante:
find . -name * -exec ls -a {} \;
On m'a demandé de l'exécuter.
Que signifie {} \;
ici?
Parfois, je vois la commande suivante:
find . -name * -exec ls -a {} \;
On m'a demandé de l'exécuter.
Que signifie {} \;
ici?
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.
À 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".
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.
Lire d'autres questions sur les étiquettes command-line find