Como copiar um arquivo para várias pastas usando a linha de comando?

67

Eu tentei copiar um arquivo test.txtpara vários diretórios com um comando:

cp ~/test.txt ~/folder1 ~/folder2

Mas não tive sucesso. Existe uma maneira de fazer isso em um comando para que eu possa copiar um arquivo ou mesmo uma pasta para vários diretórios?

nux
fonte
Não facilmente. Você pode querer olhar para "rsync" para atualizar eficientemente múltiplas cópias existentes de uma pasta
Thorbjørn Ravn Andersen
3
Tente aprender um pouco de script bash. Pode ser muito útil:for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
Shahbaz 13/03
Não é um comando único, mas pode ajudar algumas pessoas que se deparam com aqui:cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
Manu Järvinen
Duplicar de stackoverflow.com/a/195972/2097284 .
Camille Goudeseune

Respostas:

71

cppode copiar de várias fontes, mas não pode copiar para vários destinos. Veja man cppara mais informações.

O único comando bash que eu sei que pode copiar / salvar em vários destinos é tee.

Você pode usá-lo no seu caso da seguinte maneira:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

Observe que teetambém grava a entrada na saída padrão (stdout). Portanto, se você não quiser isso, poderá impedi-lo redirecionando a saída padrão para a /dev/nullseguinte:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
Radu Rădeanu
fonte
10
Inteligente, isso é trapaça! :)
terdon
5
+1, inteligente! E se você usar os >/dev/nulltrabalhos com arquivos binários também, sem estragar o terminal ...
Rmano
11
+1 para você, você é sempre um homem :), mas e se eu quiser copiar um diretório?
nux
2
@nux Não se esqueça de usar a -ropção com cpno caso de diretórios
Radu Rădeanu
4
@ nux: teeao contrário, cpcopia apenas o conteúdo do arquivo, ignorando seu modo, propriedade, timestamps. Para evitar repetir o nome do arquivo:f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
jfs
61

Outra maneira de obter uma cópia em vários locais é o seguinte comando:

find dir1 dir2 -exec cp file.txt {} \;

Se dir1 ou dir2 tiver subdiretórios nos quais você não deseja que o arquivo seja copiado, adicione a -maxdepth 0opção:

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

Observe que isso substituirá todos os arquivos no dir1e dir2com file.txto conteúdo, além de copiá-lo. Para copiar apenas file.txtsem afetar outros arquivos nesses diretórios, diga findpara agir apenas nos diretórios:

find dir1 dir2 -type d -exec cp file.txt {} \;
Sylvain Pineau
fonte
4
Ótima solução! Parece-me mais perfeito do que com tee.
Danatela 11/03/14
11
De fato, nenhum redirecionamento está envolvido e ainda é um comando.
395 Sylvain Pineau
2
@SylvainPineau De fato, existem 3: um é finde por duas vezes (neste caso) cp. Para não dizer que findprecisa de muito tempo.
Radu Rădeanu 11/03/14
3
Se a definição de "comando" for uma chamada "exec", talvez, mas esse seja "um comando" no meu livro.
kojiro
2
Eu continuo voltando a este, então pensei que deveria dar um voto positivo: D
Jonathan
31

O comando

cp ~/test.txt ~/folder1 ~/folder2

tenta copiar dois arquivos ( ~/test.txte ~/folder1) para o destino folder2. (E se ~/folder2existir e for um diretório, você receberá um aviso "omitir diretório").

Se você quiser fazer várias cópias do arquivo test.txt, precisará usar um loop ou vários comandos ...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(... e tenha cuidado se houver espaços incorporados nos nomes dos arquivos, será necessário citar).

Para copiar diretórios inteiros, você deve usar a -ropção:

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

isso criará ~/folder1/folder3e ~/folder2/folder3com todos os arquivos incluídos.

Rmano
fonte
11
Para o leitor que passa: De acordo com as especificações , um loop for é um comando composto. Portanto, esse ainda é um comando e atende a todos os requisitos da pergunta.
kojiro
@ nux, eu não concordo com as correções. 1) as duas maiúsculas estão erradas, minha intenção era intercalar os comandos na frase. 2) as elipses são uma questão de estilo; por favor deixe meu estilo entrar.
Rmano 13/03
11
ok, desculpe cara, eu pensei que ficaria melhor.
nux
no meu sistema, ele não salvar folder3 como ~ / folder1 / folder3, mas sim copia tudo em folder3 em folder1
alpha_989
23

Você pode criar um script de ajuda ou pode fazê-lo com xargsuma função de impressão (neste caso echo):

echo firstDir secondDir | xargs -n 1 cp test

Isso fará com que cada diretório seja um argumento para a cpfunção, usando o arquivo de teste como parâmetro.

Evandro Silva
fonte
Este é provavelmente o melhor / resposta mais direta à pergunta
Bryson S.
7

Depois de uma longa pesquisa, este trabalho também parece um encanto!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

Isso copiará o arquivo.txt para todos os diretórios em sua localização atual no terminal.

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

Isso copiará uma pasta para cada subdiretório na sua localização atual no terminal.

Partilho que espero que ajude os outros também.

nux
fonte
Em zsh, você pode usar o for i in *(/); ...loop sobre todos os subdiretórios, para evitar o [ -d ...teste. O globbing prolongado é uma das razões pelas quais eu gosto bash.
Rmano
pode o seu direito o código novamente em um comando
nux
11
Em zsh, o primeiro comando desta resposta pode ser simplificado como for dir in *(/); do cp /path/file.txt "$dir"; done. Veja zsh.sourceforge.net/Intro/intro_2.html
Rmano 12/14
5
Você pode eliminar o teste em qualquer shell derivado de Bourne comfor dir in */;
Henk Langeveld 13/14
@ nux Isso funciona muito bem e o comando é muito fácil de seguir. Deve ser votado muito mais alto!
Nkeguy
1

Se você deseja copiar o arquivo test.txt em todos os diretórios em / tmp / target / ...

crie um ambiente de teste:

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

copie-o:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;
mate
fonte
0

Apenas pensei em dar uma variação à resposta de Sylvain Pineau

onde dir1e dir2não está no seu diretório atual.

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

aqui, a busca procurará dir1dois níveis de profundidade ou você pode deixar de fora o -maxdepthparâmetro para encontrar dir1em todas as pastas no diretório atual e abaixo dele.

Joshi
fonte