Como copiar uma pasta para várias pastas usando a linha de comando? [duplicado]

6

Eu quero copiar uma pasta específica de um ponto para outro e tenho mais a pasta de destino 300 onde eu quero copiar essa pasta específica. Alguém pode me ajudar com uma solução adequada? sugestão de script de shell seria ótimo.

    
por santosh kale 06.07.2016 / 09:46

4 respostas

10

Supondo que sua primeira pasta é chamada foo e você deseja copiá-la para diretórios, que são especificados em destinations.txt (um por linha).

Você pode usar um for -loop para isso:

for i in $(cat destinations.txt)
do
  echo "$i" #prints the name of the current target -> you can see progress, if it takes long  
  cp -R foo/ "$i"
done 
    
por Wayne_Yux 06.07.2016 / 10:00
12

Sugiro usar um while ... do loop

while read -r d; do
  cp -R -- foo/ "$d"
done < destinations.txt

Como alternativa, use xargs

xargs -n1 -a destinations.txt cp -R foo --
    
por steeldriver 06.07.2016 / 14:28
3

O núcleo de uma função que tenho no meu .bashrc para isso é:

echo $destinations | xargs -n 1 cp $sourcefile

(Eu acho que consegui isso de esta resposta ) Se os destinos estiverem em destinations.txt , basta substituir echo $destinations com cat destinations.txt Nomes de arquivos com espaços lhe darão problemas, a menos que sejam citados na entrada, portanto, tenha cuidado com isso.

Aqui está a função completa do meu .bashrc . Provavelmente não muito robusto, já que meus casos de uso eram simples e eu não queria gastar muito com isso, então não espere que ele lide com nomes de arquivos mais estranhos muito graciosamente.

function distribute {
        arguments=""
        destinations=""
        sourcefile=""
        while [[ $# -ge 1 ]]; do
                key="$1"

                if [[ "$key" == "-h" ]]; then
                        echo "usage: $0 [flags to cp] source_file destination_1 [... destination_N]"
                elif [[ "$key" == -* ]]; then
                        arguments+=" $key"
                elif [ -z "$sourcefile" ]; then
                        sourcefile="$key"
                else
                        destinations+=" $key"
                fi

                shift
        done

        echo $destinations | xargs -n 1 cp $arguments $sourcefile
}
    
por SnoringFrog 06.07.2016 / 16:55
0
cp -r sourceFolder {destination1,destination2,destination14}
    
por Emile 07.07.2016 / 00:49