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:
|
pipe? n'est-ce pas ce que son pour?-exec
|
?Bonne question!
- 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/
- 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.
- 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 ...)
Il existe une option peu utilisée pour cp
: -t destination
- voir la page de manuel:
find . -iname "*.SomeExt" | xargs cp -t Directory
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.
Essaye ça:
find . -iname "*.SomeExt" **-print0** | xargs **-0** cp -t Directory
Au cas où il y aurait des espaces dans les noms de fichiers.