1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

Rsyncはすべてのバックアップツールを殺す、あなたは手動で特定のディレクトリをブロックすることができますか?

2022-02-07 11:40:46

はじめに

Rsync は、リモートシェル経由で 2 つの場所間のファイルやフォルダーを同期する、高速で多機能な コマンドラインユーティリティです。

Rsync を使用すると、データのミラーリング、増分バックアップの作成、システム間のファイルコピーが可能です。データをコピーする際、ファイル名や場所に基づいて 1 つまたは複数のファイルまたはディレクトリを除外したい場合があります。

今回は、rsync を使ってファイルやディレクトリを除外する方法を紹介します。

作業の準備

まずは、rsyncの仕組みと使い方を簡単に説明します。

次の例では、ディレクトリの同期、特殊デバイスとブロックデバイスの転送、シンボリックリンクの保持、時間、グループ、所有権、パーミッションの変更を再帰的に行うrsyncの-aオプションを使っています。

ファイルやディレクトリを除外する場合は、除外元ディレクトリからの相対パスを使用する必要があります。

除外するファイルやディレクトリを指定するためのオプションは2つあります。

  • コマンドラインでは、-excludeオプションを使用します。
  • ファイル内では、-exclude-fromオプションを使用します。

特定のファイルを除外する

特定のファイルを除外するには、この -exclude オプションにファイルの相対パスを渡します。以下の例では、src_directory/file.txtは転送されません。

rsync -a --exclude 'file.txt' src_directory/ dst_directory/

ディレクトリそのものではなく、ディレクトリの内容を除外するには、dir1:の代わりにdir1/*を使用します。

rsync -a --exclude 'dir1/*' src_directory/ dst_directory/

複数のファイルまたはディレクトリを除外する
複数のファイルまたはディレクトリを除外するには、複数の -exclude オプションを指定するだけです。

rsync -a --exclude 'file1.txt' --exclude 'dir1/*' --exclude 
'dir2' src_directory/ dst_directory/

を1つだけ使用したい場合 --exclude オプションを使用すると {} 除外するファイルやディレクトリをカンマ区切りで次のように列挙します。

rsync -a --exclude={'file1.txt','dir1/*','dir2'} src_directory/ dst_directory/

除外するファイルやディレクトリの数が多い場合、-exclude は複数のオプションを使用する代わりに、ファイル内の除外するファイルやディレクトリを使用することができます。この -exclude-from オプションにファイルを渡すだけです。

次のコマンドは、上記のコマンドと同じです。

rsync -a --exclude-from='exclude-file.txt' src_directory/ dst_directory/

exclude-file.txtの中に保存してください。

file1.txt
dir1/*
dir2

規則的なパターンに基づいて複数のファイルまたはディレクトリを除外する

rsync では、ファイル名やディレクトリ名に一致するパターンに基づいて、ファイルやディレクトリを除外することもできます。
例えば、すべての .jpg ファイルを実行します。

rsync -a --exclude '*.jpg*' src_directory/ dst_directory/

特定のパターンに一致するファイルやディレクトリ以外を除外することは、難しいことではありません。例えば、.jpgで終わるファイル以外のすべてのファイルとディレクトリを除外したいとします。

次のようなコマンドを使うのも一つの方法である。

rsync -a -m --include='*.jpg' --include='*/' --exclude='*' src_directory/ dst_directory/

複数使用する include/exclude オプションを指定した場合、最初にマッチしたルールが適用されます。パラメータの意味

  • --include='*.jpg' まず、すべての .jpg ファイルを含めます。
  • --include='*/' 次に、src_directoryディレクトリ内のすべてのディレクトリをインクルードします。これをしないと、rsync は *.jpg トップレベル ディレクトリのファイルのみをコピーします。
  • -m 空のディレクトリを削除する

もう一つの選択肢は、findコマンドの出力をrsyncに渡すことです。

find src_directory/ -name "*.jpg" -printf %P\\0\\n | rsync -a --files-from=- src_directory/ dst_director

パラメータの意味

  • -printf %P\\\0\\n src_directory/file のパスから削除します。
  • --files-from=- 標準入力からのファイル(findコマンドから渡されたファイル)のみを含めることを示す。

最初の方法が制御しにくい場合、このfindコマンドによって行われるフィルタリングは、opsの学生にとってずっと友好的であるべきです。

最後に書く

rsyncが大量に使われるようになれば、ローカルからサーバー、サーバーからサーバー、ディレクトリやファイルの同期を毎日行うための標準ツールとしてscpに取って代わるはずだ。

Rsyncのこの記事は、すべてのバックアップツールを殺す、あなたは手動で特定のディレクトリをブロックすることができますか?Rsyncの詳細については、過去の記事を検索するか、次の記事を引き続き参照してください。