Rsync は、バックアップを作成したり、2 つの異なる場所 (またはサーバー) 間でファイルやディレクトリを同期したりするための非常に強力なツールです。
以前に rsync に関する実用的な例を紹介したので、これはもうご存知でしょう。
典型的なバックアップ状況では、バックアップから 1 つ以上のファイル (またはディレクトリー) を除外したい場合があります。特定のファイル タイプを rsync から除外することもできます。
この記事では、rsync 中に複数のファイルやディレクトリを無視する方法について、例を挙げて説明します。
最初に、以下に示すように、テスト目的で使用できるサンプル ディレクトリ構造を (いくつかの空のファイルを使用して) 作成します。
$ cd ~ $ mkdir -p source/dir1/dir2 $ mkdir -p source/dir3 $ touch source/file1.txt $ touch source/file2.txt $ touch source/dir1/dir2/file3.txt $ touch source/dir3/file4.txt
上記のコマンドは、次の構造を持つソース ディレクトリ (ホーム ディレクトリの下) を作成します。
source - file1.txt - file2.txt - dir1 - dir2 - file3.txt - dir3 - file4.txt
1.特定のディレクトリを除外
dir1 (そのすべてのサブディレクトリを含む) をソースから宛先フォルダーに同期したくない場合は、以下に示すように rsync –exclude オプションを使用します。
$ rm -rf destination $ rsync -avz --exclude 'dir1' source/ destination/ building file list ... done created directory dest ./ file1.txt file2.txt dir3/ dir3/file4.txt
dir1 がソース ディレクトリから宛先ディレクトリにコピーされていないことを確認してください。
$ find destination destination destination/file2.txt destination/file1.txt destination/dir3 destination/dir3/file4.txt
2.パターンに一致する複数のディレクトリを除外
次の例では、パターン「dir*」に一致する source/ の下のディレクトリ (またはサブディレクトリ) を除外します。
$ rm -rf destination $ rsync -avz --exclude 'dir*' source/ destination/ building file list ... done created directory destination ./ file1.txt file2.txt
宛先ディレクトリを検証して、キーワード「dir」を含むディレクトリがコピーされていないことを確認してください。
$ find destination destination destination/file2.txt destination/file1.txt
3.特定のファイルを除外
特定のファイルを除外するには、以下に示すように、除外オプションでファイルの相対パスを使用します。
$ rm -rf destination $ rsync -avz --exclude 'dir1/dir2/file3.txt' source/ destination/ building file list ... done created directory destination ./ file1.txt file2.txt dir1/ dir1/dir2/ dir3/ dir3/file4.txt
宛先ディレクトリを確認して、特定のファイル (この例では dir1/dir2/file3.txt) がコピーされていないことを確認します。
$ find destination destination destination/file2.txt destination/file1.txt destination/dir1 destination/dir1/dir2 destination/dir3 destination/dir3/file4.txt
4.除外パスは常に相対です
注意しないと、この間違いを犯す可能性があります。
次の例では、除外オプションにフル パス (つまり、/dir1/dir2/file3.txt) が指定されているようです。ただし、rsync の観点からは、除外パスは常に相対パスであり、dir1/dir2/file3.txt として扱われます。以下の例では、rsync はソース ディレクトリ (/ ルート ディレクトリではなく) の下で dir1 を探します。
$ rsync -avz --exclude '/dir1/dir2/file3.txt' source/ destination/
したがって、上記のコマンドは次のコマンドとまったく同じです。混乱を避けるために (そして読みやすくするために)、除外パスの前に / を付けないでください。
$ rsync -avz --exclude 'dir1/dir2/file3.txt' source/ destination/
5.特定のファイル タイプを除外する
特定の拡張子を持つ特定のファイルの種類を除外するには、適切なパターンを使用します。たとえば、拡張子として .txt を含むすべてのファイルを除外するには、次のようにします。
$ rsync -avz --exclude '*.txt' source/ destination/ building file list ... done created directory destination ./ dir1/ dir1/dir2/ dir3/
宛先ディレクトリを確認して、*.txt ファイルがコピーされていないことを確認してください。
$ find destination destination destination/dir1 destination/dir1/dir2 destination/dir3
注: 上記は、ホーム ディレクトリをバックアップしたいが、特定のファイル拡張子を持つ巨大な画像や動画ファイルをすべて除外したい場合に非常に役立ちます。
6.複数のファイルとディレクトリを同時に除外
複数のファイルとディレクトリを除外する場合は、以下に示すように、コマンド ラインでいつでも複数の rsync 除外オプションを指定できます。
$ rsync -avz --exclude file1.txt --exclude dir3/file4.txt source/ destination/
待って。 rsync から除外したいファイルが大量にある場合はどうすればよいですか?
複数の –exclude を使用してコマンド ラインにそれらを追加し続けることができず、読みにくく、後で rsync コマンドを再利用するのが困難です。
そのため、より良い方法は、以下に示すように rsync –exclude-from オプションを使用することです。ここでは、ファイルで除外するすべてのファイル (およびディレクトリ) を一覧表示できます。
まず、バックアップしたくないすべてのファイルとディレクトリのリストを含むテキスト ファイルを作成します。これは、rsync から除外するファイルとディレクトリのリストです。
$ vim exclude-list.txt file1.txt dir3/file4.txt
次に、以下に示すように、exclude-list.txt で –exclude-from オプションを使用して rsync を実行します。
$ rm -rf destination $ rsync -avz --exclude-from 'exclude-list.txt' source/ destination/ building file list ... done created directory destination ./ file2.txt dir1/ dir1/dir2/ dir1/dir2/file3.txt dir3/
宛先ディレクトリを確認して、exclude-list.txt ファイルにリストされているファイルとディレクトリがバックアップされていないことを確認してください。
$ find destination destination destination/file2.txt destination/dir1 destination/dir1/dir2 destination/dir1/dir2/file3.txt destination/dir3