web-dev-qa-db-ja.com

一方向の同期で、マシン上の2つのフォルダーを同期する方法は?

特定のファイルを作成し、その後、その種類のファイル(フォルダーA)のストレージエリアに移動するセットアップがあります。私のマシンには別のフォルダーがあり、そこにもファイルをコピーする必要があります(フォルダーB)。

次のようなセットアップを行う方法はありますか?

  • フォルダーAに作成されたファイルがフォルダーBに存在しない場合、フォルダーBに自動的にコピーされますか?
  • フォルダーAにない新しいファイルがフォルダーBに表示される場合、通知されますか?

両方のフォルダーは同じファイルシステムにあります。

完全に自動である必要はありません。ターミナルでいくつかのコマンドを実行して、フォルダーBにコピーする必要がある新しいファイルを確認し、それらをコピーして、どのファイルがコピーされたかを通知することをお勧めします。また、フォルダーAにないフォルダーBにファイルがある場合.

Ubuntu GNOME 15.04、GNOME Shell、およびGNOME 3.16を実行しています。

4
user364819

もう1つの(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にコピーします
  • aにないBのファイルを報告します

スクリプト

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

警告:これは双方向同期のためですが、手動で物事を行うことに問題がないことを考えると...私は単方向のオプションがあるかどうかわかりません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
Rmano

これでうまくいくはずです。 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コマンドは、一度に1行ずつファイル名をリストしますが、名前のみをリストし、他の情報はリストしません。したがって、このスクリプトは、あるフォルダー内のファイルが、同じ名前を持つ他のフォルダー内のファイルよりも新しい場合には気づきません。

「<」をグレープすると、フォルダーAのファイルが得られますが、フォルダーBのファイルは得られません。「>」の場合も同様です。 zenityによって作成された変数を使用して、コピーコマンドなどを作成できます。

1
Jos