Parfois, je vois la commande suivante:
find . -name * -exec ls -a {} \;
On m'a demandé d'exécuter ceci.
Que signifie {} \;
ici?
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.
Depuis la page de manuel pour la commande find
name__ :
-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
name__". 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 (tiré de here ).
La partie \;
indique en gros find
"bon, c’est fini avec la commande que je voulais exécuter".
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 cat
pour chaque fichier trouvé par find
name__, donc cat file1.txt
, cat file2.txt
, etc.