Parfois, je vois la commande suivante :
find . -name * -exec ls -a {} \;
On m'a demandé de l'exécuter.
Qu'est-ce que {} \;
veut dire ici ?
Parfois, je vois la commande suivante :
find . -name * -exec ls -a {} \;
On m'a demandé de l'exécuter.
Qu'est-ce que {} \;
veut dire ici ?
Si vous exécutez find
con exec
, {}
se développe vers le nom de fichier de chaque fichier ou répertoire trouvé avec find
(de sorte que ls
dans votre exemple prend chaque nom de fichier trouvé comme argument - notez qu'elle appelle ls
ou toute autre commande que vous spécifiez une fois pour chaque fichier trouvé).
Point-virgule ;
termine la commande exécutée par exec
. Il doit être échappé avec \
de sorte que le Shell que vous exécutez find
inside ne le traite pas comme son propre caractère spécial, mais le transmet à find
.
Véase cet article pour plus de détails.
Aussi, find
permet une certaine optimisation avec exec cmd {} +
- quand il est exécuté comme ça, 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 d'efficacité) est facilement perceptible si on l'exécute avec ls
par exemple
find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +
En supposant que vous ayez jpg
(avec des chemins suffisamment courts ), le résultat est une ligne par fichier dans le premier cas et le standard ls
comportement d'affichage des fichiers en colonnes pour ces derniers.
Desde el pour la page de manuel de l find
commande :
-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.
Voici donc l'explication :
{}
signifie "la sortie de find
". Comme dans, "tout ce qui find
trouvé". find
renvoie le chemin du fichier que vous recherchez, non ? Donc {}
le remplace ; il s'agit d'un espace réservé pour chaque fichier que l'application find
localise (tiré de aquí ).
En \;
est essentiellement de dire find
"OK, j'ai fini avec la commande que je voulais exécuter".
Disons que je suis dans un répertoire rempli de .txt
des fichiers. J'exécute ensuite :
find . -name '*.txt' -exec cat {} \;
La première partie, find . -name *.txt
retourne une liste des .txt
fichiers. La deuxième partie, -exec cat {} \;
exécutera le cat
pour chaque fichier trouvé par find
donc cat file1.txt
, cat file2.txt
et ainsi de suite.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.