- Sim,
find / -name "*.txt" | cp /junk
não funcionará porquecp
não lê seus argumentos de stdin. - Não,
find / -name "*.txt" | xargs cp /junk
também não funcionará porquexargs
anexará os argumentos que lê de stdin ao comando, portanto,cp
tentaria copiar na direção errada. (Você pode tentar corrigir isso com a opção-I
paraxargs
, mas você pode simplesmente usarfind -exec
.) - Sim,
find / -name ".txt" -exec cp {} /junk \;
funcionará, mas usará uma chamada decp
para 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.