Companheiro raidicar, eu coloco os diretórios onde tu quiser!
Ok! Isso não ficou muito legal..., mas deixemos de lado essa colocação e sigamos em frente.
Coelhuturbo, eu não tenho um script semelhante para que com algumas alterações você possa utiliza-lo e, sinceramente, não seio onde tem pois nunca vi ninguém com o mesmo problema, mas como eu disse, a solução não é difícil.
o comando
cp que você está estudando nem entra nesse caso, passa longe da solução que precisa e por estar totalmente longe da solução, vou postar além do comando que precisa, uma "biblia", para que todos que tiverem o mesmo problema entendam exatamente como a coisa funciona. Se quiser apenas a resposta, vá até o final, se quiser entende-lá, leia tudo com atenção, OK?
O conhecimento que você precisa ter é:
1 - Comando Find.
2 - Váriaveis (Não chega a ser necessário, mas é bom saber)
3 - Comando Rsync.
"Problema" do rsync:
1 - Não é bidirecional, pelo menos já li o man do rsync quase completo e não encontrei um parâmetro que o torna bidirecional (alguém me corrija se estiver errado).
Isso significa que ele sincroniza o diretório A com o diretório B, ou seja, se um arquivo for alterado em B, ao sincronizar A com B o mesmo não será atualizado no diretório A, para isso é preciso um segundo comando sincronizando o diretório B com o diretório A.
Quando além da origem, o destino também sofre alterações, essa é a única forma de deixar o conteúdo de duas pastas sempre idênticasTendo dito essa informação que é importante saber, voltamos ao assunto.
Primeiro, veja o comando rsync que poderia fazer esse trabalho:
rsync -Cravzpu --existing /home/coelhuturbo/editados /home/coelhuturbo/originais
Nesse caso, os arquivos modificados por você na pasta
editados serão copiado para a pasta
originais, mas isso somente se na pasta
originais existirem arquivos com o mesmo nome e extensão dos arquivos na pasta
editados. Caso existam, os arquivos mais antigos que estão na pasta
originais serão substituidos pelos arquivos mais novos que estão na pasta
editados, caso não existissem, nada seria efetuado, isso graças a opção
--existing e a opção -u do parâmetro
-Cravzpu inserida no comando rsync.
Com relação aos outros parametros (-Cravzp), pesquise no manual do rsync (é só digitar
man rsync no terminal).
Ex: se inserir o q (Cravzpu
q), de quiet, a cópia será silenciosa, ou seja, nada será exibido no terminal.
Isso, em teoria, solucionaria o seu problema, mas como eu disse, não sei a quantidade de subdiretórios e nem a freqüência com que os mesmos são criados.
Suponto que sejam 20 diretórios e subdiretórios no total, e que raramente um novo diretório é criado, bastaria um script com 20 linhas de comandos como o que está acima para fazer o que deseja.Ex:
#!/bin/bash
rsync -Cravzpu --existing /home/coelhuturbo/editados /home/coelhuturbo/originais
rsync -Cravzpu --existing /home/coelhuturbo/editados /home/coelhuturbo/originais/subori01
rsync -Cravzpu --existing /home/coelhuturbo/editados /home/coelhuturbo/originais/subori01/subori001
rsync -Cravzpu --existing /home/coelhuturbo/editados /home/coelhuturbo/originais/subori02/
rsync -Cravzpu --existing /home/coelhuturbo/editados /home/coelhuturbo/originais/subori03/
etc...
Um loop poderia ser realizado facilmente se as suas pastas fossem nomeadas com caracteres e em ordem numéricas... Claro que não é o caso.
Mas isso é meio trabalhoso, supondo que você tenha muitos diretórios e subdiretórios, algo em torno de 200 pastas no total e que praticamente todo dia fosse adicionado mais diretórios e subdiretórios, nesse caso, a solução acima seria inviável, pois exigiria uma administração complexa demais, nos forçado a automatizar essa tarefa.
Nesse ponto entra o comando find.
find /home/coelhuturbo/originais/ -name *.txt
Nesse caso, o comando find pesquisa todos os arquivos com extensão txt dentro do diretório e subdiretórios de
originais.
Creio que foi o find que você utilizou para jogar todos os arquivos dos diretórios e subdiretórios de A para a raiz de B.
Outro comando find...
find /home/coelhuturbo/originais/ -maxdepth 10 -type d
Esse comando mostra a arvore de diretórios começando em
originais com até 10 subdiretórios dentro dela.
Como já lhe informei sobre o rsync e o find, eu iria lhe propor o desafio de:
1 - Listas os diretórios e subdiretórios com o find.
2 - armazenar cada linha do resultado em uma variável, assim, cada variável seria o destino.
3 - sincronizar com o rsync a origem dos dados, que seria a pasta
editados com cada uma das variáveis definidas anteriormente, ou seja, o destino, que seria cada diretório e subdiretório da pasta
originais.
Mas hoje é segunda então não vou estragar seu inicio de semana.
Antes de prosseguir, é importante saber de outro "problema" do rsync.
Eu li o man do rsync e não encontrei uma opção ao comando rsync que o faça sincronizar uma origem com vários destinos, (me corrijam se estiver errado), ou seja, o mesmo sincroniza o
A para
B, e pronto, se quiser sincronizar
A para
C,
A para
B/A e
A para
B/A/F, é necessário uma nova linha de comando para cada, resumindo, uma linha de comando para cada destino, isso tornaria o processo lento e doloroso, além de difícil de administrar, pois quanto maior o numero de subdiretórios na pasta
originais, mais comandos teríamos de dar e é impossível fugir disso, foi por esse motivo que não lhe pedi para se virar com variáveis.
Nesse caso, burlamos tudo isso e
chegamos onde você espera unindo os comandos rsync e find.
A idéia é:
1 - Localizar um arquivo por uma determinada extensão pelo comando find na pasta e subpastas de DESTINO.(no caso, como exemplo, a pasta
originais, pois ela é o destino dos arquivos alterados e que estão em outro local)
2 - Ao localizar um arquivo, parar, realizar o sincronismo, ou seja, ir buscar um arquivo com o mesmo nome na pasta de ORIGEM.(no caso, como exemplo, a pasta
editados é a origem, pois dela sairão os arquivos para a pasta
originais)
2.1 - Ao localizar o arquivo, comparar a data de alteração para decidir se deve haver substituição.(se o arquivo na pasta
editados for mais novo que o arquivo na ou subpasta
originais, substitua-o)
3 - Agora, após o comando find localizar um arquivo e o comando rsync substitui-lo por outro mais novo com o mesmo nome, o comando find deve continuar a procura pelo próximo arquivo. E esse processo se repete até que todos os diretórios e subdiretórios de ORIGINAIS sejam vasculhados pelo comando find.Isso tudo realizado por uma única linha de comando em velocidade impressionante.
A linha de comando é:
find /home/coelhuturbo/originais/ -name *.txt -type f -exec rsync -Cravzpu /home/coelhuturbo/editados/*.txt {} \;
Altere *.txt pela extensão que utiliza.
Abaixo, apenas informações que acredito que você nem precise, mas apenas para deixar registrado, já digitei tanto mesmo...
Abra o editor de texto, digite o conteúdo abaixo e salvando com o nome de coelhoturbo.
#!/bin/bash
find /home/coelhuturbo/originais/ -name *.txt -type f -exec rsync -Cravzpu /home/coelhuturbo/editados/*.txt {} \;
agora de os comandos
sudo chmod +x coelhuturbo e o comando
cp coelhuturbo /usr/bin/Agora você pode executar o sincronismo da seguinte forma:
1 - digitando coelhuturbo no terminal.
2 - pode criar um lançador no desktop e executar o sincronismo dando um duplo clique...
ok?
Abraços...