web-dev-qa-db-fra.com

Comment synchroniser deux dossiers sur ma machine, dans une synchronisation directionnelle?

J'ai une configuration dans laquelle je crée un certain fichier, puis le déplace dans une zone de stockage pour ce type de fichier (dossier A). Il y a un autre dossier sur ma machine où je dois également copier le fichier (dossier B).

Y a-t-il un moyen de faire un montage dans lequel:

  • un fichier, créé dans le dossier A, est automatiquement copié dans le dossier B s'il n'existe pas dans le dossier B?
  • Je serai averti si de nouveaux fichiers apparaissent dans le dossier B, mais pas dans le dossier A?

Les deux dossiers sont sur le même système de fichiers.

Il n'est pas nécessaire que ce soit entièrement automatique. Je préférerais exécuter une commande dans le terminal pour vérifier si de nouveaux fichiers doivent être copiés dans le dossier B, les copier et me notifier les fichiers copiés. Également s'il y a des fichiers dans le dossier B qui ne sont pas dans le dossier A.

J'utilise Ubuntu GNOME 15.04, avec GNOME Shell et GNOME 3.16.

4
user364819

Une autre option (python), offrant un peu de "fantaisie" rapport:

----------------------------------------------------------
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
----------------------------------------------------------

Il fait ce que tu décris:

  • il copie les fichiers du dossier A à B s’ils n’existent pas (encore) en B
  • rapporte les fichiers en B, qui ne sont pas en A

Le scénario

#!/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*"-")

Comment mettre en place

  1. Copiez le script dans un fichier vide, enregistrez-le sous le nom sync_report.py

  2. Testez-le avec la commande:

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

    Si les répertoires contiennent des espaces, placez-les entre guillemets simples.

  3. Si tout fonctionne bien, utilisez-le comme ci-dessus ou:

    • rendre le script exécutable
    • ajoutez la commande suivante à une touche de raccourci:

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

      Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande.

    Ensuite, lorsque vous appuyez sur la combinaison de touches:

    enter image description here

    Ne laissez pas l’arrière-plan vous distraire, mon terminal est semi-transparent. :)

Alternativement, comme mentionné par @ParanoidPanda (merci de le mentionner), ajoutez-le à votre fichier ~/.bashrc. Créez un alias qui appelle le script:

alias <nameofalias>='python3 /path/to/sync_report.py <folder_a> <folder_b>'
1
Jacob Vlijm

Avertissement : ceci est destiné à la synchronisation bidirectionnelle, mais étant donné que vous êtes ok pour faire les choses manuellement ... Je ne sais pas s'il existe une option pour unidirectionnel comportement dans unison --- si quelqu'un le sait, n'hésitez pas à modifier cette réponse.

Installez à l'unisson:

 Sudo apt-get install unison unison-gtk

Créez ce fichier dans le répertoire $HOME/.unison, appelez-le test.prf (ou autre)

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

Lancez unison à partir du tiret, choisissez votre profil ci-dessus et effectuez une première synchronisation. Vous aurez une interface graphique pour choisir quoi copier et où.

Après cela, effectuez les modifications et, lorsque vous souhaitez rester synchronisé, utilisez à nouveau l'unisson. Cela vous permettra de décider quoi faire:

enter image description here

4
Rmano

Cela devrait vous aider. zenity a de nombreuses autres applications qui dépassent le cadre de votre question. personnalisez ceci comme vous voudrez.

#!/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

Quelques explications:

Les commandes ls -1 répertorient les noms de fichier ligne par ligne, mais uniquement les noms, sans autre information. Ce script ne remarquera donc pas lorsqu'un fichier dans un dossier est plus récent qu'un fichier dans l'autre dossier portant le même nom.

Grepping pour "<" nous donnera des fichiers dans le dossier A mais pas dans le dossier B, et inversement pour ">". Vous pouvez utiliser les variables créées par zenity pour créer une commande de copie ou autre chose.

1
Jos