1. 概要

rsync は、一般的に使用されるファイル同期ツールです。 rsync を使用してファイルを転送する場合、動作は cp コマンドと同様であり、ファイルは宛先ディレクトリにコピーされます。

ご存知のように、 cp は、ソースディレクトリのシンボリックリンク(シンボリックリンク)をデスティネーションディレクトリへのシンボリックリンクとしてコピーします。 このチュートリアルでは、rsyncを使用したシンボリックリンクのコピーについて説明します。

2. 問題の分析

例から始めましょう。 ディレクトリsource_directoryがあるとします。

$ pwd
/home/alice
$ ls –l source_directory/
total 0
-rw-r--r-- 1 alice alice  6 May 12  8:35 file1
lrwxrwxrwx 1 alice alice  5 May 12  8:35 flink1 -> file1
lrwxrwxrwx 1 alice alice 10 May 12  8:35 flink2 -> /tmp/file2
lrwxrwxrwx 1 alice alice 25 May 12  8:35 flink3 -> ../source_directory/file1
lrwxrwxrwx 1 alice alice 34 May 12  8:35 flink4 -> /home/alice/source_directory/file1

source_directoryの内容を理解しましょう。

  • file1 :通常のファイル
  • flink1 file1を直接指す相対シンボリックリンク
  • flink2 :別のディレクトリ / tmp /file2内のファイルを指す絶対シンボリックリンク
  • flink3 file1を間接的に指す相対シンボリックリンク
  • flink4 file1を指す絶対シンボリックリンク

次に、 rsync を使用して、source_directoryの内容を別のディレクトリdestination_directoryにコピーしてみましょう。

$ rsync source_directory/* destination_directory
skipping non-regular file “flink1”
skipping non-regular file “flink2”
skipping non-regular file “flink3”
skipping non-regular file “flink4”

rsyncのオプションは使用しませんでした。 rsync の出力によると、シンボリックリンクをコピーできなかったようです。 destination_directoryの内容を確認しましょう。

$ ls –l destination_directory/
total 0
-rw-r--r-- 1 alice alice 6 May 12  8:35 file1

明らかなように、通常のファイルfile1しかコピーできませんでした。 私たちの目的は、シンボリックリンクもコピーすることです。

3. -lオプションの使用

シンボリックリンクのコピーには、rsync-lオプションを使用できます。 rsync は、このオプションを使用して、ソースディレクトリ内のシンボリックリンクをデスティネーションディレクトリへのシンボリックリンクとしてコピーします。

-l オプションを使用して、source_directoryの内容をdestination_directoryにコピーしてみましょう。

$ rm -f destination_directory/* 
$ rsync -l source_directory/* destination_directory/
$ ls -l destination_directory/
total 0
-rw-r--r-- 1 alice alice  6 May 12  8:35 file1
lrwxrwxrwx 1 alice alice  5 May 12  8:35 flink1 -> file1
lrwxrwxrwx 1 alice alice 10 May 12  8:35 flink2 -> /tmp/file2
lrwxrwxrwx 1 alice alice 25 May 12  8:35 flink3 -> ../source_directory/file1
lrwxrwxrwx 1 alice alice 34 May 12  8:35 flink4 -> /home/alice/source_directory/file1

この場合、シンボリックリンクのコピーは成功します。 rsyncfile1destination_directoryにコピーしました。 flink1 は、destination_directoryfile1へのシンボリックリンクです。 絶対シンボリックリンクflink2およびflink4は、 source_directoryにあるものと同様に、ファイル / tmp/file2および/home/ alice / source_directory /file1を指します。 。

ただし、 flink3 は、 ../ destination_directory / file1 ではなく、 ../ source_directory /file1を指します。 source_directoryのflink3は、同じディレクトリ内の file1 を指していますが、 rsync は、rsyncがシンボリックリンクを外部ディレクトリを指すものとして扱いました。 X188X]シンボリックリンクパスの二重ドット(..)。 したがって、destination_directory../source_directory /file1を指します。

-l の代わりに、 –linksオプションを使用することもできます。 どちらのオプションも同じです。

rsync-aまたは–archive オプションは、シンボリックリンクのコピーにも使用できます。 このオプションは、rsyncの他のいくつかのオプションのコレクションです。 -lオプションが含まれています。 

この例では、ファイルへのシンボリックリンクのみをコピーしましたが、同じ方法でディレクトリへのシンボリックリンクをコピーすることもできます。 ただし、ディレクトリのコピーには、 rsync–rオプションを使用する必要があります。

4. シンボリックリンクのrsyncの他のオプション

-l オプションは、シンボリックリンクをコピーするためのrsyncの唯一のオプションではありません。 他にもいくつかのオプションがあります。 それらのいくつかを見てみましょう。

4.1. –safe-linksオプション

宛先ディレクトリ内を指すシンボリックリンクをコピーするだけの場合は、–safe-linksオプションを使用できます。 この場合、rsyncは絶対シンボリックリンクも無視します

$ rm –f destination_directory/*
$ rsync –l –-safe-links source_directory/* destination_directory/
$ ls -l destination_directory/
total 0
-rw-r--r-- 1 alice alice  6 May 12  8:35 file1
lrwxrwxrwx 1 alice alice  5 May 12  8:35 flink1 -> file1

ご覧のとおり、 rsync は、シンボリックリンク flink2 flink3 、およびflink4をコピーしませんでした。 宛先ディレクトリ内のfile1を指すシンボリックリンクであるため、flink1のみをコピーしました。 flink3は宛先ディレクトリの外にある../source_directory / file1 を指すため、rsyncflink3をコピーしませんでした。 flink2flink4も絶対シンボリックリンクであるため、コピーしませんでした。

4.2. –copy-unsafe-linksオプション

–copy-unsafe-linksオプションは、もう1つの利用可能なオプションです。 このオプションを使用すると、rysncはソースディレクトリの外側を指すシンボリックリンクを通常のファイルのように扱います

$ rm –f destination_directory/*
$ rsync –l –-copy-unsafe-links source_directory/* destination_directory/
$ ls -l destination_directory/
total 0
-rw-r--r-- 1 alice alice  6 May 12  8:35 file1
lrwxrwxrwx 1 alice alice  5 May 12  8:35 flink1 -> file1
-rw-r--r-- 1 alice alice  0 May 12  8:35 flink2
-rw-r--r-- 1 alice alice  6 May 12  8:35 flink3
-rw-r--r-- 1 alice alice  6 May 12  8:35 flink4

ご覧のとおり、flink1は以前と同様にfile1へのシンボリックリンクとしてコピーされました。 ただし、 flink2 flink3 、およびflink4はシンボリックリンクではなくなりました。 rsync は、シンボリックリンク自体ではなく、これらのシンボリックリンクによって参照されるファイルを転送しました。

4.3. -Lオプション

-Lオプションは、すべてのシンボリックリンクを通常のファイルとして転送する場合に便利です。 この場合、シンボリックリンクは作成されません

$ rm –f destination_directory/*
$ rsync –L source_directory/* destination_directory/
$ ls -l destination_directory/
total 0
-rw-r--r-- 1 alice alice  6 May 12  8:35 file1
-rw-r--r-- 1 alice alice  6 May 12  8:35 flink1
-rw-r--r-- 1 alice alice  0 May 12  8:35 flink2
-rw-r--r-- 1 alice alice  6 May 12  8:35 flink3
-rw-r--r-- 1 alice alice  6 May 12  8:35 flink4

出力から明らかなように、すべてのシンボリックリンクは通常のファイルとしてコピーされました。

-Lの代わりに–copy-linksオプションを使用することもできます。どちらも同じです。

5. 結論

このチュートリアルでは、rsyncを使用してシンボリックリンクをコピーするいくつかの方法について説明しました。 rsync をオプションなしで使用すると、シンボリックリンクが無視されることがわかりました。

–l オプションを使用すると、すべてのシンボリックリンクをコピーできます。

宛先ディレクトリの外側を指すシンボリックリンクと絶対シンボリックリンクを無視する場合は、 –safe-linksオプションを使用できます。

ソースディレクトリの外部を指すシンボリックリンクを通常のファイルとして転送する場合は、 –copy-unsafe-linksオプションを使用できます。

最後に、 -L オプションを使用すると、すべてのシンボリックリンクを通常のファイルとして転送できます。