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 pourfindet un autre pourcp. -
Au lieu d'utiliser
exec()à l'intérieur defindré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 ...)