O comando de cópia é cp
. Se você der a ele o sinalizador -r
(recursivo), ele fará exatamente o que você deseja, copiará arquivos em pastas existentes e criará novas pastas quando a pasta de destino estiver faltando.
No entanto, você nunca deve analisar a saída de ls
, você deve usar find
a href="http://tldp.org/LDP/abs/html/globbingref.html"> bash globbing :
cp -rv foo/2011* bar/
Se houver arquivos e pastas cujo nome comece com 2011
, use a opção find
e seu -exec
, que aplicará o comando fornecido a tudo que for encontrado por find
(referido como {}
):
find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;
Neste caso específico, não há razão para salvar a saída de um comando e passá-lo para cp
. Às vezes isso é necessário, então é assim que é feito. Em geral, a saída de um comando pode ser dada como entrada para outro comando se colocado dentro de comas invertidos ou $()
.
cp -rv 'find foo/ -type d -name "2011*"' bar/
ou
cp -rv $(find foo/ -type d -name "2011*") bar/
Como alternativa, você pode percorrer os resultados:
for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done
Isso fica mais complicado se os nomes dos arquivos / pastas puderem conter caracteres especiais ou novas linhas e coisas do gênero. Nesse caso, você deve fazer algo assim:
find foo/ -type d -name "2011*" | while IFS= read -r dir; do
cp -rv "$dir" bar/;
done