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

58

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

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

Mas eu não consegui. 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?

    
por nux 11.03.2014 / 17:11

7 respostas

64

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

O único comando bash que conheço que pode copiar / salvar em vários destinos é tee .

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

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

Observe que tee també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 /dev/null da seguinte forma:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
    
por Radu Rădeanu 11.03.2014 / 18:01
52

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

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

Se dir1 ou dir2 tiver subdiretórios para os quais você não deseja que o arquivo seja copiado, adicione -maxdepth 0 option:

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

Observe que isso substituirá todos os arquivos em dir1 e dir2 com o conteúdo de file.txt , além de copiá-lo. Para copiar apenas file.txt sem afetar outros arquivos nesses diretórios, informe find para atuar somente nos diretórios:

find dir1 dir2 -type d -exec cp file.txt {} \;
    
por Sylvain Pineau 11.03.2014 / 17:31
30

O comando

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

tenta copiar dois arquivos ( ~/test.txt e ~/folder1 ) para o destino folder2 . (E se ~/folder2 existir e for um diretório, você terá um aviso "omitindo diretório").

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

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

(... e tenha cuidado se você tem espaços embutidos nos nomes dos arquivos, você precisará de citações).

Para copiar diretórios inteiros você tem que usar a opção -r :

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

isso criará ~/folder1/folder3 e ~/folder2/folder3 com todos os arquivos incluídos.

    
por Rmano 11.03.2014 / 17:25
22

Você pode criar um script de ajuda ou pode fazê-lo com xargs e uma função de impressão (nesse caso, echo ):

echo firstDir secondDir | xargs -n 1 cp test

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

    
por Evandro Silva 11.03.2014 / 17:28
6

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

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

Isso copiará file.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

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

Compartilho espero que ajude os outros também.

    
por nux 12.03.2014 / 01:06
1

Se você quiser 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:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;
    
por matt 29.06.2015 / 16:26
0

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

em que dir1 e dir2 não estão em seu diretório atual.

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

veja aqui que procurará dir1 dois níveis de profundidade ou você pode deixar de fora o parâmetro -maxdepth para encontrar dir1 em todas as pastas no diretório atual e abaixo dele.

    
por Joshi 07.10.2017 / 20:42