- Sim,
find / -name "*.txt" | cp /junknão funcionará porquecpnão lê seus argumentos de stdin. - Não,
find / -name "*.txt" | xargs cp /junktambém não funcionará porquexargsanexará os argumentos que lê de stdin ao comando, portanto,cptentaria copiar na direção errada. (Você pode tentar corrigir isso com a opção-Iparaxargs, mas você pode simplesmente usarfind -exec.) - Sim,
find / -name ".txt" -exec cp {} /junk \;funcionará, mas usará uma chamada decppara cada arquivo (e iniciará esse comando assim que o arquivo for encontrado).
Você também pode tentar esta solução, eu deveria iniciar apenas uma invocação de cp (ou pelo menos começará o mínimo possível, o comprimento da linha de comando é limitado):
find / -path /junk -prune -or -name '*.txt' -print0 | xargs -0 sh -c 'cp "$@" /junk'
Como @don_chrissti comentou, você pode usar cp -t se tiver o cp do GNU. Então pode ser feito assim
find / -path /junk -prune -or -name '*.txt' -print0 | xargs -0 cp -t /junk
ou até mesmo
find / -path /junk -prune -or -name '*.txt' -exec cp -t /junk {} +
Todos os três irão coletar tantos argumentos quanto caber na linha de comando e executar o mínimo de cp possível. Mas ainda pode ser o caso de um cp ser iniciado antes de find ser feito, então temos que excluir /junk caso contrário, ele poderá encontrar as cópias.