rsyncを使用したシンボリックリンクのコピー
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
この場合、シンボリックリンクのコピーは成功します。 rsyncはfile1をdestination_directoryにコピーしました。 flink1 は、destination_directoryのfile1へのシンボリックリンクです。 絶対シンボリックリンク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オプション
$ 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 を指すため、rsyncはflink3をコピーしませんでした。 flink2とflink4も絶対シンボリックリンクであるため、コピーしませんでした。
4.2. –copy-unsafe-linksオプション
$ 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オプション
$ 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 オプションを使用すると、すべてのシンボリックリンクを通常のファイルとして転送できます。