設定

設定

WindowsからLinuxに移行した後、Winmergeの代替案を見つけたり、Linux上の2つのフォルダを比較して同期したりするコマンドラインツールを学びたいと思いました。コマンドラインで次のタスクを実行する方法を教えてください。

「/home/user/A」と「/home/user/B」という2つのフォルダがあります。

フォルダAは通常のファイルとフォルダが保存される場所、フォルダBはフォルダAの完全なミラーとして機能するバックアップフォルダです。 (ユーザーはフォルダBに何も直接保存または変更することはできません。)

私の質問は次のとおりです

  • フォルダBにのみ存在するファイルを一覧表示するには? (たとえば、最後の同期以降にフォルダAから削除されたコンテンツです。)

  • Bフォルダにのみ存在するファイルをAフォルダにコピーするにはどうすればよいですか?

  • 2つのフォルダにあるがタイムスタンプやサイズが異なるファイルを一覧表示する方法は? (最後の同期以降にフォルダAで修正されたファイルです。数万のファイルがあり、プロセスが遅すぎる可能性があるため、チェックサムを使用しないことをお勧めします。)

  • フォルダAをフォルダBに正確にコピーするには?私は、フォルダAにのみ存在するフォルダBのすべてのアイテムをフォルダAにコピーし、フォルダBにのみ存在するフォルダBのすべてのアイテムを削除しますが、フォルダ内の同じファイルにすべて触れないことです。

答え1

これにより、フォルダAがフォルダBに保存されます。

rsync -avu --delete "/home/user/A" "/home/user/B"

欲しいならフォルダAとBの内容同じままにするには/home/user/A/(スラッシュを含む)をソースとして使用してください。フォルダAをインポートする代わりに、フォルダのすべての内容をインポートしてフォルダBに入れます。次のように:

rsync -avu --delete "/home/user/A/" "/home/user/B"
  • -aすべてのファイルシステム属性を同期して保存します。
  • -v詳しく走る
  • -u変更時間が最新のファイルのみをコピーします(または時間が同じ場合はサイズの違い)。
  • --deleteソースに存在しないターゲットフォルダのファイルを削除する

マンページ:https://download.samba.org/pub/rsync/rsync.html

答え2

unisonペンシルベニア大学のBenjamin Pierceによって開発されたツールを使用できます。

2つのディレクトリがあるとしましょう。

/home/user/Documents/dirA/そして/home/user/Documents/dirB/

2つを同期するには、次のものを使用できます。

~$unison -ui text /home/user/Documents/dirA/ /home/user/Documents/dirB/

出力にはunison各ディレクトリとファイルが表示されます。その他同期を要求した 2 つのディレクトリにあります。最初の実行時に追加の同期を提案し(両方の場所から欠落しているファイルのコピー)、コンピュータに同期ツリーを作成して維持し、後続の実行時に実際の同期を実装します(たとえば、ファイルから削除する場合).../dirA.../dirB各変更を比較して削除することもできます。今後またはキャンセル2つのディレクトリ間の同期。

または、グラフィカルインターフェイスを起動するには、-ui textコマンドからオプションを削除します。cli使用する方が簡単で高速です。

その他の関連コンテンツ:Unison ユーザー文書の Unison チュートリアル

答え3

-cTuxForLifeの答えはとても良いですが、ローカルで同期するときに使用することをお勧めします。リモート同期のためにこれを行うのに時間/ネットワークコストがかからないと主張することもできますが、ローカルファイルの場合は速度が速すぎるため、それは価値があります。

-c, --checksum
       This forces the sender to checksum every regular file using a 128-bit  MD4
       checksum.   It  does this during the initial file-system scan as it builds
       the list of all available files. The receiver then checksums  its  version
       of  each  file  (if  it exists and it has the same size as its sender-side
       counterpart) in order to decide which files need to be updated: files with
       either  a  changed  size  or a changed checksum are selected for transfer.
       Since this whole-file checksumming of all files on both sides of the  con-
       nection  occurs  in  addition to the automatic checksum verifications that
       occur during a file's transfer, this option can be quite slow.

       Note that rsync always verifies that each transferred file  was  correctly
       reconstructed  on  the receiving side by checking its whole-file checksum,
       but that automatic after-the-transfer verification has nothing to do  with
       this  option's  before-the-transfer  "Does  this file need to be updated?"
       check.

これは、同じサイズとタイムスタンプを使用すると失敗する可能性があることを示しています。

設定

$ cd /tmp

$ mkdir -p {A,b}/1/2/{3,4}

$ echo "\___________from A" | \
      tee A/1/2/x  | tee A/1/2/3/y  | tee A/1/2/4/z  | \
  tr A b | \
      tee b/1/2/x  | tee b/1/2/3/y  | tee b/1/2/4/z  | \
      tee b/1/2/x0 | tee b/1/2/3/y0 >     b/1/2/4/z0

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b

rsyncはファイルのサイズとタイムスタンプの両方が同じであるため、何もコピーしません。

$ rsync -avu A/ b
building file list ... done

sent 138 bytes  received 20 bytes  316.00 bytes/sec
total size is 57  speedup is 0.36

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b    

rsyncはチェックサムを比較するのでうまくいきます。

$ rsync -cavu A/ b
building file list ... done
1/2/x
1/2/3/y
1/2/4/z

sent 381 bytes  received 86 bytes  934.00 bytes/sec
total size is 57  speedup is 0.12

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from A
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from A
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from A
b/1/2/x0
\___________from b

答え4

あなたは少し見ることができます。Fitus/Zaloha.sh。これは、標準のUnixコマンドのみを使用してbashシェルスクリプトとして実装された同期デバイスです。使いやすい:

$ Zaloha.sh --sourceDir="test_source" --backupDir="test_backup"

関連情報