3 votes

Pourquoi find -exec n'accepte-t-il que {} dans certaines positions ?

La commande suivante fonctionne correctement :

find . -iname \*.7z -exec ls {} -al \;

Mais pendant que je change \; a \+ C'est-à-dire :

find . -iname \*.7z -exec ls {} -al \+

J'ai reçu un rapport d'erreur :

missing argument to `-exec'

Je découvre quand je change {} La position de l'Union européenne :

find . -iname \*.7z -exec ls -al {} \+

La commande ci-dessus peut fonctionner correctement.

Je ne sais plus où j'en suis.

5voto

Eliah Kagan Points 111731

Les + forme de -exec place toujours les arguments à la fin de la commande que vous donnez. C'est pourquoi, {} qui représente les arguments, doit précéder immédiatement + . Ceci est différent de la ; forme de -exec qui exécute une commande par fichier trouvé et utilise le nom du fichier quel que soit l'endroit où il se trouve. {} apparaît.

C'est donc votre réponse... mais cela soulève une autre question : pourquoi 其の est en place en premier lieu, ce qui est un peu plus obscur.

Avec + , le -exec exécute votre commande aussi peu de fois que possible, en passant autant de noms de fichiers que possible à la place de {} . En particulier s'il y a de nombreux fichiers trouvés, cette forme de -exec n'est utilisable qu'avec des commandes qui se comportent de la même manière - ou du moins d'une manière cohérente avec ce que vous souhaitez - lorsque les noms de fichiers sont répartis entre plusieurs invocations de la commande, comme c'est le cas lorsque tous les noms de fichiers apparaissent lors d'une seule invocation.

Les commandes qui acceptent un nombre variable d'arguments de nom de fichier en une seule invocation, afin de produire le même effet que si la commande était exécutée une fois pour chaque nom de fichier, les acceptent souvent en tant qu'arguments de fin. Il existe, bien sûr, des exceptions comme cp y mv avec des cibles de répertoire (bien que vous puissiez passer -t _dir_ pour les faire fonctionner avec + ). Il est également un peu plus facile de raisonner à ce sujet, en ce sens que lorsque vous écrivez ls -l suivi de noms de fichiers, on a l'impression que ls -l est "la commande" que vous exécutez pour opérer sur les fichiers nommés, mais lorsque vous écrivez ls suivi des noms de fichiers, suivi de -l mais ce n'est pas tout à fait l'impression que l'on a.

En ce qui concerne les mesures à prendre, votre approche consistant à mettre en place des options telles que -l avant le {} est bonne. Cela présente d'autres avantages : bien que cela soit moins courant sur les systèmes GNU/Linux comme Ubuntu que sur d'autres systèmes d'exploitation de type Unix, certaines commandes n'acceptent pas d'options après l'apparition d'un argument qui n'en est pas un. (Voir getopt(3) pour plus de détails).

Puisque vous exécutez ls vous pouvez envisager d'utiliser find 's -ls au lieu de -exec . Notez également qu'il n'est pas nécessaire de citer + puisque, contrairement à ; Les coquilles ne traitent pas les + spécialement le caractère.

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