web-dev-qa-db-fra.com

Est-il possible de diriger les résultats de FIND vers une commande COPY CP?

Est-il possible de diriger les résultats de find vers une commande COPY cp?

Comme ça:

find . -iname "*.SomeExt" | cp Destination Directory

Cherchant, je trouve toujours ce genre de formule comme dans cet article :

find . -name "*.pdf" -type f -exec cp {} ./pdfsfolder \;

Cela soulève quelques questions:

  1. Pourquoi ne pouvez-vous pas simplement utiliser | pipe? n'est-ce pas ce que son pour?
  2. Pourquoi tout le monde recommande le -exec
  3. Comment savoir quand utiliser ce (exec) sur le pipe |?
14
Paul

Bonne question!

  1. pourquoi ne pouvez-vous pas utiliser | tuyau? n'est-ce pas ce que son pour?

Vous pouvez diriger, bien sûr, xargs est fait pour les cas suivants:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/
  1. Pourquoi tout le monde recommande -exec

Le -exec est utile car il permet de mieux contrôler ce que vous exécutez. Chaque fois que vous faites une pipe, il peut y avoir des problèmes avec les angles: noms de fichiers contenant des espaces ou de nouvelles lignes, etc.

  1. comment puis-je savoir quand utiliser ce (exec) sur pipe | ?

C'est vraiment à vous et il peut y avoir beaucoup de cas. J'utiliserais -exec chaque fois que l'action à effectuer est simple. Je ne suis pas un très bon ami de xargs, j'ai tendance à préférer une approche dans laquelle la sortie find est fournie à une boucle while, telle que:

while IFS= read -r result
do
    # do things with "$result"
done < <(find ...)
16
fedorqui

Il existe une option peu utilisée pour cp: -t destination - voir la page de manuel:

find . -iname "*.SomeExt" | xargs cp -t Directory
15
glenn jackman

Vous pouvez utiliser | comme ci-dessous:

find . -iname "*.SomeExt" | while read line
do
  cp $line DestDir/
done

Répondre à vos questions:

  • | peut être utilisé pour résoudre ce problème. Mais comme vu ci-dessus, cela implique beaucoup de code. De plus, | créera deux processus - un pour find et un autre pour cp.

  • Utiliser plutôt exec() dans find résoudra le problème en un seul processus.

6
Fazlin

Essaye ça:

find . -iname "*.SomeExt" **-print0**  | xargs **-0** cp -t Directory

Au cas où il y aurait des espaces dans les noms de fichiers.

0
epetrov