104 votes

Pourquoi trouver -exec mv {} ./target/ + ne fonctionne-t-il pas? (sur cygwin)

Je veux savoir exactement ce que {} \; {} + et | xargs .... faire: Merci de préciser ces avec des explications.

En dessous de 3 exécution des commandes et de sortie en même résultat, mais la première commande prend un peu de temps et le format est également un peu différent.

**

find . -type f -exec file {} \;
find . -type f -exec file {} \+
find . -type f | xargs file

**

C'est parce que le 1er, on exécute "fichier" commande pour chaque fichier en provenance de commande "find". Donc, fondamentalement, il s'exécute en tant que:

file file1.txt
file file2.txt

Mais les 2 derniers de trouver avec les commandes exec exécutez le fichier de commande une fois pour tous les fichiers comme ci-dessous:

file file1.txt file2.txt

Puis-je exécuter les commandes suivantes sur laquelle la première s'exécute sans problème mais la deuxième donne un message d'erreur.

find . -type f -iname '*.cpp' -exec mv {} ./test/ \;
find . -type f -iname '*.cpp' -exec mv {} ./test/ \+ #gives error:find: missing argument to `-exec'

Pour la commande {} +, il me donne le message d'erreur

trouver: missing argument `-exec"

pourquoi est-ce? quelqu'un peut-il expliquer ce que je fais mal?

194voto

Lekensteyn Points 22873

La page de manuel assez bien explique tout.

find-exec commande {} \;

Pour chaque résultat, command {} est exécutée. Toutes les occurrences de {} sont remplacés par le nom de fichier. ; est précédé d'une barre oblique pour éviter que le shell de l'interpréter.

find-exec commande {} +

Chaque résultat est ajouté à l' command et exécuté par la suite. Prenant le commandement des limitations de longueur en compte, je pense que cette commande peut être exécutée plusieurs fois, avec la page de manuel de me soutenir:

le nombre total d'appels de la commande sera beaucoup moins que le nombre de fichiers correspondants.

Notez cette citation de la page de manuel:

La ligne de commande est construit de la même manière que xargs construit ses lignes de commande

C'est pourquoi aucun des caractères sont autorisés entre {} et + , sauf pour les espaces. + permet de trouver détecter que les arguments doivent être joints à la commande comme xargs.

La solution

Heureusement, mv peut accepter le répertoire cible comme un argument, -t ou plus de paramètre --target. C'est l'utilisation sera:

mv -t target file1 file2 ...

Votre find commande devient:

find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+

À partir de la page de manuel:

-exec commande ;

Exécution de la commande; vrai si 0 statut est retourné. Tous les arguments suivants à trouver sont les arguments de la commande jusqu'à ce qu'un argument consistant en ;' is encountered. The string{} "est remplacé par le nom du fichier en cours en cours de traitement partout où il se produit dans les arguments de la commande, et pas seulement dans les arguments où il est seul, comme dans certaines versions de trouver. Deux de ces constructions pourraient avoir besoin d'être échappés (avec un `\') ou de la cité afin de les protéger de l'expansion par le shell. Voir les EXEMPLES de la section pour des exemples de l'utilisation de l'option-exec. La commande spécifiée est exécuté une fois pour chaque fichier correspondant. La commande est exécutée dans le répertoire de démarrage. Il y a des inévitables problèmes de sécurité entourant l'utilisation de l'-exec action; vous devez utiliser l'-execdir option à la place.

-exec commande {} +

Cette variante de l'-exec action exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est construit en ajoutant chaque nom de fichier sélectionné à la fin; le nombre total d'appels de la commande sera beaucoup moins que le nombre de fichiers correspondants. La ligne de commande est construit de la même manière que xargs construit ses lignes de commande. Une seule instance de `{}' est permis dans la commande. La commande est exécutée dans le répertoire de démarrage.

-1voto

Mike Ramirez Points 3528

non, la différence entre + et \; devrait être inversée. + ajoute les fichiers à la fin de la commande exec puis exécute la commande exec et \; exécute la commande pour chaque fichier.

Le problème est find . -type f -iname '*.cpp' -exec mv {} ./test/ \+ devrait être find . -type f -iname '*.cpp' -exec mv {} ./test/ + pas besoin d'y échapper ou de mettre fin au +

xargs je ne l'ai pas utilisé depuis longtemps mais je pense que ça marche comme +.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X