如何以单向同步的方式同步我的机器上的两个文件夹?

如何以单向同步的方式同步我的机器上的两个文件夹?

我有一个设置,我创建了一个特定的文件,然后将其移动到该类型文件的存储区域(文件夹 A)。我的机器上还有另一个文件夹,我也必须将文件复制到该文件夹​​(文件夹 B)。

有没有什么方法可以进行以下设置:

  • 如果文件夹 B 中不存在在文件夹 A 中创建的文件,那么该文件是否会自动复制到文件夹 B?
  • 如果文件夹 B 中出现文件夹 A 中没有的新文件,我会收到通知吗?

两个文件夹位于同一个文件系统上。

它不必完全自动化;我更愿意在终端中运行一些命令来检查是否有需要复制到文件夹 B 的新文件,复制它们并通知我哪些文件已被复制。此外,如果文件夹 B 中有任何文件不在文件夹 A 中。

我正在运行 Ubuntu GNOME 15.04,带有 GNOME Shell 和 GNOME 3.16。

答案1

警告:这是用于双向同步,但考虑到您可以手动执行操作......我不知道是否有单向行为的选项unison---如果有人知道,请随时编辑这个答案。

安装 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,选择上面的配置文件并进行第一次同步。您将有一个图形界面来选择要复制的内容和位置。

之后,进行更改,当您想要保持同步时,再次使用 unison。它将让您决定要做什么:

在此处输入图片描述

答案2

另一个(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
----------------------------------------------------------

它的功能正如你所描述的:

  • 如果文件在文件夹 B 中尚不存在,它会将文件从文件夹 A 复制到文件夹 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'"
      

      选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。点击“+”添加命令。

    然后,当按下组合键时:

    在此处输入图片描述

    不要让背景分散你的注意力,我的终端是半透明的。:)

或者,如 @ParanoidPanda 所述(感谢提及),将其添加到您的~/.bashrc文件中。创建一个调用脚本的别名:

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

答案3

这应该可以让你开始。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命令每次列出一行文件名,但只列出名称,没有其他信息。因此,此脚本不会注意到一个文件夹中的文件比另一个文件夹中同名的文件更新。

查找“<”会返回文件夹 A 中的文件,但不会返回文件夹 B 中的文件,反之亦然。您可以使用创建的变量来zenity构建复制命令或其他命令。

答案4

看一下https://github.com/Fitus/Zaloha.sh。这是一个开箱即用的 shell 脚本。它是交互式的,因此您将看到并确认它将要做什么。

相关内容