Como sincronizar duas pastas na minha máquina, em uma sincronização direcional?

4

Eu tenho uma configuração na qual eu crio um determinado arquivo e, em seguida, movo-o para uma área de armazenamento para esse tipo de arquivo (pasta A). Existe outra pasta na minha máquina onde eu também devo copiar o arquivo para (pasta B).

Existe alguma maneira de fazer uma configuração em que:

  • um arquivo, criado na pasta A, é copiado automaticamente para a pasta B, se não existir na pasta B?
  • Eu serei notificado se novos arquivos aparecerem na pasta B, que não estão na pasta A?

Ambas as pastas estão no mesmo sistema de arquivos.

Não precisa ser totalmente automático; Eu preferiria executar algum comando no terminal para verificar se há novos arquivos que precisem ser copiados para a Pasta B, copiá-los e notificar quais arquivos foram copiados. Além disso, se houver arquivos na pasta B que não estejam na pasta A.

Estou executando o Ubuntu GNOME 15.04, com o GNOME Shell e o GNOME 3.16.

    
por Jacob Vlijm 26.08.2015 / 13:40

3 respostas

1

Outra opção (python), que oferece um pouco de um relatório "sofisticado":

----------------------------------------------------------
Newly copied from /home/jacob/map 1 to /home/jacob/map 2:
- Naamloos document
- pscript_2.py
- test123
- monkey_out.txt
----------------------------------------------------------
Unique files in /home/jacob/map 2:
- file_in_targetfolder
----------------------------------------------------------

Ele faz o que você descreve:

  • copia arquivos da pasta A para B se eles ainda não existirem em B
  • reporta arquivos em B, que não estão em A

O script

#!/usr/bin/env python3
import sys
import os
import shutil

folder_1 = sys.argv[1]; folder_2 = sys.argv[2]
files_1 = os.listdir(folder_1); files_2 = os.listdir(folder_2)
# make the length (n) of separating line "smart"
s = "\nNewly copied from "+folder_1+" to "+folder_2+':'; n = len(s)
print("\n"+n*"-"+s)
for f in files_1:
    f1 = folder_1+"/"+f
    if all([os.path.isfile(f1), not f in files_2]):
        shutil.copyfile(f1, folder_2+"/"+f)
        print("-",f)
print(n*"-"+"\nUnique files in "+folder_2+":")
for f in files_2:
    f2 = folder_2+"/"+f
    if all([os.path.isfile(f2), not f in files_1]):
        print("-",f)
print(n*"-")

Como configurar

  1. Copie o script em um arquivo vazio, salve-o como sync_report.py

  2. Teste - execute-o pelo comando:

    python3 /path/to/sync_report.py <folder_a> <folder_b>
    

    Se os diretórios contiverem espaços, coloque-os entre aspas simples.

  3. Se tudo funcionar bem, use-o como acima ou:

    • torna o script executável
    • adicione o seguinte comando a uma tecla de atalho:

      gnome-terminal -e "'/path/to/sync_report.py' '/path/to/folder_a' '/path/to/folder_b'"
      

      Escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando.

    Então, quando a combinação de teclas é pressionada:

    Não deixe que o fundo distraia você, meu terminal é semitransparente. :)

Como alternativa, como mencionado por @ParanoidPanda (obrigado por mencionar), adicione-o ao seu arquivo ~/.bashrc . Crie um alias que chame o script:

alias <nameofalias>='python3 /path/to/sync_report.py <folder_a> <folder_b>'
    
por Jacob Vlijm 26.08.2015 / 17:14
3

Aviso : isto é para sincronização bidirecional, mas como você está bem em fazer as coisas manualmente ... Eu não sei se há uma opção para o comportamento unidirecional em unison --- Se alguém souber por favor sinta-se à vontade para editar esta resposta.

Instale o uníssono:

 sudo apt-get install unison unison-gtk

Crie este arquivo no diretório $HOME/.unison , chame-o test.prf (ou qualquer outro)

label = sync folders A and B
root = /home/romano/tmp/folderA
root = /home/romano/tmp/folderB

Execute unison do traço, escolha seu perfil acima e faça uma primeira sincronização. Você terá uma interface gráfica para escolher o que copiar e onde.

Depois disso, faça as alterações e, quando quiser manter a sincronização, use o uníssono novamente. Isso permitirá que você decida o que fazer:

    
por Rmano 26.08.2015 / 16:41
1

Isso deve fazer você ir. zenity tem muitas outras aplicações além do escopo da sua pergunta; personalize isso como você gosta.

#!/bin/bash
ls -1 ./FolderA | sort > FolderA.txt
ls -1 ./FolderB | sort > FolderB.txt
FILESTOCOPY=$(diff FolderA.txt FolderB.txt | grep \< | awk '{print $2;}' | zenity --list --title="Select files to be copied" --co$
echo $FILESTOCOPY
NEWFILES=$(diff FolderA.txt FolderB.txt | grep \> | awk '{print $2;}' | zenity --list --title="New files in Folder B" --column="f$
echo $NEWFILES

Algumas explicações:

Os comandos ls -1 listam os nomes dos arquivos uma linha por vez, mas apenas os nomes, nenhuma outra informação. Esse script, portanto, não notará quando um arquivo em uma pasta for mais novo que um na outra pasta com o mesmo nome.

Grepping para "<" nos dará arquivos na pasta A, mas não na pasta B, e vice-versa para ">". Você poderia usar as variáveis criadas por zenity para criar um comando de cópia ou outra coisa.

    
por Jos 26.08.2015 / 14:21