Как синхронизировать две папки на моей машине в одной направленной синхронизации?

У меня есть установка, в которую я создаю определенный файл и впоследствии перемещаю его в область хранения для того типа файла (папка A). Существует другая папка на моей машине, где я должен также скопировать файл в (папку B).

Есть ли любой способ сделать установку в который:

  • файл, созданный в папке A, автоматически копируется в Папку B, если это не существует в папке B?
  • Я буду уведомлен, если новый файл (файлы) появится в Папке B, которые не находятся в папке A?

Обе папки находятся в той же файловой системе.

Это не должно быть полностью автоматически; я предпочел бы выполнять некоторую команду в терминале для проверки на новые нуждающиеся файлы, которые будут скопированы в Папку B, скопировал бы их и уведомил бы меня, какие файлы были скопированы. Также, если существуют какие-либо файлы в Папке B, которые не находятся в Папке A.

Я выполняю Ubuntu GNOME 15.04 с GNOME Shell и GNOME 3.16.

4
задан 26 August 2015 в 18:17

4 ответа

Другой (Python) опция, предлагая что-то вроде "необычного" отчета:

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

Это делает то, что Вы описываете:

  • это копирует файлы с папки A to B, если они еще не существуют в B
  • файлы отчетов в B, которые не находятся в A

Сценарий

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

Как настроить

  1. Скопируйте сценарий в пустой файл, сохраните его как sync_report.py

  2. Тестовый прогон это командой:

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

    Если каталоги содержат пробелы, помещают их между одинарными кавычками.

  3. Если все хорошо работает, используйте его как выше, или:

    • сделайте исполняемый файл сценария
    • добавьте следующую команду к сочетанию клавиш:

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

      Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду.

    Затем когда сочетание клавиш нажимается:

    enter image description here

    Не позволяйте фону отвлечь Вас, мой терминал является полупрозрачным.:)

С другой стороны, как упомянуто @ParanoidPanda (благодарит упомянуть), добавьте его к Вашему ~/.bashrc файл. Создайте псевдоним, который называет сценарий:

alias <nameofalias>='python3 /path/to/sync_report.py <folder_a> <folder_b>'
1
ответ дан 1 December 2019 в 09:22

Предупреждение : это для двунаправленной синхронизации, но, учитывая, что Вы в порядке в выполнении вещей вручную... Я не знаю, существует ли опция для однонаправленного поведения в unison---, если любой знает, не стесняйтесь редактировать этот ответ.

унисон Установки:

 sudo apt-get install unison unison-gtk

Создают этот файл в каталоге $HOME/.unison, называют его test.prf (или безотносительно)

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

Выполнение unison от тире, выбирают Ваш профиль выше и делают первую синхронизацию. У Вас будет графический интерфейс для выбора, что скопировать и где.

После этого, сделайте изменения и когда Вы хотите сохранить в синхронизации, используйте унисон снова. Это позволит Вам решить, что сделать:

enter image description here

4
ответ дан 1 December 2019 в 09:22

Это должно получить Вас движение. zenity имеет намного больше приложений вне объема Вашего вопроса; настройте это, как Вам нравится.

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

Некоторое объяснение:

ls -1 команды перечисляют имена файлов одна строка за один раз, но только имена, никакая другая информация. Этот сценарий поэтому не заметит, когда файл в одной папке будет более новым, чем одна в другой папке с тем же именем.

Grepping для "<"; даст нам файлы в Папке A, но не в Папке B, и наоборот для">". Вы могли использовать переменные, созданные zenity для создания команды копии или чего-то еще.

1
ответ дан 1 December 2019 в 09:22

Взгляните на https://github.com/Fitus/Zaloha.sh. Это сценарий оболочки, который исчерпывает поле. Это является интерактивным, таким образом, Вы будете видеть и подтверждать то, что это собирается сделать.

0
ответ дан 1 December 2019 в 09:22

Другие вопросы по тегам:

Похожие вопросы: