
問題
cp -H
またはを使用してファイルをコピーするとcp -L
、同じ結果が得られます。
$ ls -l fileA
fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
fileA # fileA is a copy of fileB, only renamed, with same properties!
この答えはこちらは、 と組み合わせて使用されない限り、両方のオプションが同様であると説明しています-R
。 私の場合はそうではありません。 ソフト - ハードリンクされたファイルは、ソースで指しているファイルの名前が変更されたコピーになります。
質問:
cp -H
およびの適切な使用法は何ですかcp -L
? これは期待される動作ですか?
私の解決の試み:
man cp
どちらのオプションでもほぼ同じことを伝えますがinfo cp
、文言私にとってはさらに混乱を招きます。これをもう少しわかりやすく説明してくれる人がいたら教えてください。
-H
コマンドライン引数がシンボリックリンクを指定する場合、シンボリックリンクではなく、それが指すファイルをコピーするそれ自体。しかし、任意のシンボリックリンクをコピーする(その性質を維持する)再帰的なトラバーサルによって遭遇したもの。
これは私には矛盾しているように思えます。シンボリックリンクの性質「それはどこかを指しているということです…」
-L, --dereference
シンボリック リンクからコピーするときに、シンボリック リンクをたどります。このオプションでは、cp
シンボリック リンクを作成できません。たとえば、ソース ツリー内のシンボリック リンク (通常のファイルへの) は、宛先ツリー内の通常のファイルにコピーされます。
シンボリックリンクが通常のファイルではないことは知っていますが、ここでの説明は難しすぎると認めざるを得ません。
答え1
シンボリックリンクを使用すると、ツールは次の 2 つの操作を実行できます。
- シンボリックリンクをシンボリックリンクとして扱う(「その性質を維持する」)、または
- シンボリック リンクを、それが指すファイルのタイプとして扱います。
「その性質を保持する」というのは-H
矛盾ではありません。別の例を考えてみましょう。 を使用すると-L
、見つかったシンボリックリンクがすべてcp
開かれ、その内容がターゲットファイル名にコピーされます。つまり、ソースはシンボリックリンクでしたが、そのコピーはシンボリックリンクではありません。つまり、「シンボリックリンクとしての性質は失われました」。
考慮する
$ mkdir subdir
$ echo "some contents" > subdir/file
$ ln -s file subdir/link
# definition of "list", the abbreviated ls -l output used below
$ list() { ls -l "$@" | \
awk '$0 !~ /^total/ { printf "%s %s\t%s %s %s\n", $1, $5, $9, $10, $11 }' ; }
$ list subdir
-rw-rw-r-- 14 file
lrwxrwxrwx 4 link -> file
$ cp -rH subdir subdir-with-H
$ list subdir-with-H
-rw-rw-r-- 14 file
lrwxrwxrwx 4 link -> file
$ cp -rL subdir subdir-with-L
$ list subdir-with-L
-rw-rw-r-- 14 file
-rw-rw-r-- 14 link
答え2
と の動作の違いは-L
、が指定されている-H
場合-r
にも発生します。 cp
ではサブディレクトリにシンボリック リンクは作成されません-L -r
が、 を使用すると作成されます-H -r
。