Il y a 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,|
va créer deux processus - un pourfind
et un autre pourcp
. -
Au lieu d'utiliser
exec()
à l'intérieur defind
résoudra le problème en un seul processus.
Bonne question !
- pourquoi ne pouvez-vous pas simplement utiliser | tuyau? c'est pas pour ça ?
Vous pouvez piper, bien sûr, xargs
est fait pour ces cas :
find . -iname "*.SomeExt" | xargs cp Destination_Directory/
- Pourquoi tout le monde recommande-t-il -exec
Le -exec
est bon car il offre plus de contrôle sur ce que vous exécutez exactement. Chaque fois que vous faites un pipe, il peut y avoir des problèmes avec des cas d'angle :noms de fichiers contenant des espaces ou de nouvelles lignes, etc.
- comment puis-je savoir quand utiliser ce (exec) sur pipe | ?
Cela dépend vraiment de vous et il peut y avoir de nombreux 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 le find
la sortie est fournie à un while
boucle, comme :
while IFS= read -r result
do
# do things with "$result"
done < <(find ...)