56 votes

Que signifie "{} \ ;" signifie dans la commande find ?

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 ?

70voto

moon.musick Points 1752

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.

30voto

Alaa Ali Points 29075

Desde el pour la page de manuel de l find commande 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.

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".

Beispiel:

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.

SistemesEz.com

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.

Powered by:

X